@burh/nuxt-core 1.0.359 → 1.0.361

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 (450) hide show
  1. package/.ebignore +25 -25
  2. package/.elasticbeanstalk/config.yml +18 -18
  3. package/.eslintrc.json +39 -39
  4. package/.gitlab-ci.yml +16 -16
  5. package/CHANGELOG.md +2 -2
  6. package/README.md +22 -22
  7. package/app.html +8 -8
  8. package/assets/css/font-awesome/css/font-awesome.css +2337 -2337
  9. package/assets/css/font-awesome/css/font-awesome.min.css +4 -4
  10. package/assets/css/font-awesome/fonts/fontawesome-webfont.svg +2671 -2671
  11. package/assets/css/nucleo/css/nucleo-svg.css +134 -134
  12. package/assets/css/nucleo/css/nucleo.css +572 -572
  13. package/assets/css/nucleo/fonts/nucleo-icons.svg +312 -312
  14. package/assets/css/variables.css +2 -2
  15. package/assets/images/burhCv.svg +6 -6
  16. package/assets/images/facebookCv.svg +3 -3
  17. package/assets/images/icons/facebook.svg +14 -14
  18. package/assets/images/icons/historicCv.svg +3 -3
  19. package/assets/images/icons/icon3.svg +3 -3
  20. package/assets/images/icons/icon4.svg +3 -3
  21. package/assets/images/icons/icon5.svg +3 -0
  22. package/assets/images/icons/icon6.svg +3 -0
  23. package/assets/images/icons/linkedin.svg +14 -14
  24. package/assets/images/icons/notesCv.svg +3 -3
  25. package/assets/images/icons/twitter.svg +14 -14
  26. package/assets/images/icons/whatsapp.svg +14 -14
  27. package/assets/images/linkedinCv.svg +3 -3
  28. package/assets/images/webCv.svg +4 -4
  29. package/assets/sass/argon.scss +104 -104
  30. package/assets/sass/burh-ds/_components.scss +142 -142
  31. package/assets/sass/burh-ds/_functions.scss +29 -29
  32. package/assets/sass/burh-ds/_helpers.scss +18 -18
  33. package/assets/sass/burh-ds/_mixins.scss +17 -17
  34. package/assets/sass/burh-ds/_transitions.scss +12 -12
  35. package/assets/sass/burh-ds/_utilities.scss +31 -31
  36. package/assets/sass/burh-ds/_variables.scss +963 -963
  37. package/assets/sass/burh-ds/_vendors.scss +38 -38
  38. package/assets/sass/burh-ds/atoms/_badge.scss +5 -5
  39. package/assets/sass/burh-ds/atoms/_buttons.scss +222 -222
  40. package/assets/sass/burh-ds/atoms/_forms.scss +416 -416
  41. package/assets/sass/burh-ds/atoms/_tables.scss +31 -31
  42. package/assets/sass/burh-ds/atoms/_type.scss +147 -147
  43. package/assets/sass/burh-ds/mixins/_badge.scss +37 -37
  44. package/assets/sass/burh-ds/mixins/_breakpoints.scss +39 -39
  45. package/assets/sass/burh-ds/mixins/_grid-framework.scss +66 -66
  46. package/assets/sass/burh-ds/mixins/_grid.scss +51 -51
  47. package/assets/sass/burh-ds/molecules/_box.scss +282 -282
  48. package/assets/sass/burh-ds/molecules/_breadcrumb.scss +8 -8
  49. package/assets/sass/burh-ds/molecules/_modal.scss +175 -175
  50. package/assets/sass/burh-ds/molecules/_navbar.scss +262 -262
  51. package/assets/sass/burh-ds/molecules/_notifications.scss +1 -1
  52. package/assets/sass/burh-ds/molecules/_steps-profile.scss +67 -67
  53. package/assets/sass/burh-ds/molecules/_testimonial.scss +53 -53
  54. package/assets/sass/burh-ds/organisms/_banner.scss +51 -51
  55. package/assets/sass/burh-ds/organisms/_cards.scss +228 -228
  56. package/assets/sass/burh-ds/organisms/_carousel.scss +113 -113
  57. package/assets/sass/burh-ds/organisms/_footer.scss +115 -115
  58. package/assets/sass/burh-ds/organisms/_profile-bar.scss +130 -130
  59. package/assets/sass/burh-ds/organisms/_search.scss +17 -17
  60. package/assets/sass/burh-ds/organisms/_subheader.scss +773 -773
  61. package/assets/sass/burh-ds/organisms/_tabs-setting.scss +123 -123
  62. package/assets/sass/burh-ds/organisms/banners/_banner.scss +62 -62
  63. package/assets/sass/burh-ds/organisms/cards/_featured-company.scss +17 -17
  64. package/assets/sass/burh-ds/organisms/cards/_opportunity.scss +16 -16
  65. package/assets/sass/burh-ds/pages/_error.scss +124 -124
  66. package/assets/sass/burh-ds/pages/_jobs.scss +424 -424
  67. package/assets/sass/burh-ds/pages/_testes.scss +350 -350
  68. package/assets/sass/burh-ds/variables/_colors.scss +350 -350
  69. package/assets/sass/burh-ds/variables/_global_settings.scss +39 -39
  70. package/assets/sass/core/alerts/_alert-dismissible.scss +48 -48
  71. package/assets/sass/core/alerts/_alert-notify.scss +47 -47
  72. package/assets/sass/core/alerts/_alert.scss +49 -49
  73. package/assets/sass/core/avatars/_avatar-group.scss +22 -22
  74. package/assets/sass/core/avatars/_avatar.scss +59 -59
  75. package/assets/sass/core/badges/_badge-circle.scss +29 -29
  76. package/assets/sass/core/badges/_badge-dot.scss +42 -42
  77. package/assets/sass/core/badges/_badge-floating.scss +18 -18
  78. package/assets/sass/core/badges/_badge.scss +67 -67
  79. package/assets/sass/core/breadcrumbs/_breadcrumb.scss +42 -42
  80. package/assets/sass/core/buttons/_button-brand.scss +12 -12
  81. package/assets/sass/core/buttons/_button-group.scss +79 -79
  82. package/assets/sass/core/buttons/_button-icon.scss +92 -92
  83. package/assets/sass/core/buttons/_button.scss +90 -90
  84. package/assets/sass/core/cards/_card-animations.scss +10 -10
  85. package/assets/sass/core/cards/_card-blockquote.scss +17 -17
  86. package/assets/sass/core/cards/_card-money.scss +27 -27
  87. package/assets/sass/core/cards/_card-pricing.scss +26 -26
  88. package/assets/sass/core/cards/_card-profile.scss +49 -49
  89. package/assets/sass/core/cards/_card-stats.scss +16 -16
  90. package/assets/sass/core/cards/_card.scss +70 -70
  91. package/assets/sass/core/charts/_chart.scss +69 -69
  92. package/assets/sass/core/close/_close.scss +47 -47
  93. package/assets/sass/core/collapse/_accordion.scss +38 -38
  94. package/assets/sass/core/content/_main-content.scss +17 -17
  95. package/assets/sass/core/custom-forms/_custom-checkbox.scss +47 -47
  96. package/assets/sass/core/custom-forms/_custom-control.scss +58 -58
  97. package/assets/sass/core/custom-forms/_custom-form.scss +45 -45
  98. package/assets/sass/core/custom-forms/_custom-radio.scss +38 -38
  99. package/assets/sass/core/custom-forms/_custom-toggle.scss +122 -122
  100. package/assets/sass/core/dropdowns/_dropdown.scss +89 -89
  101. package/assets/sass/core/footers/_footer.scss +159 -159
  102. package/assets/sass/core/forms/_form-extend.scss +38 -38
  103. package/assets/sass/core/forms/_form-validation.scss +78 -78
  104. package/assets/sass/core/forms/_form.scss +125 -125
  105. package/assets/sass/core/forms/_input-group.scss +136 -136
  106. package/assets/sass/core/grid/_grid.scss +31 -31
  107. package/assets/sass/core/headers/_header.scss +7 -7
  108. package/assets/sass/core/icons/_icon-actions.scss +57 -57
  109. package/assets/sass/core/icons/_icon-shape.scss +48 -48
  110. package/assets/sass/core/icons/_icon.scss +88 -88
  111. package/assets/sass/core/list-groups/_list-check.scss +52 -52
  112. package/assets/sass/core/list-groups/_list-group.scss +46 -46
  113. package/assets/sass/core/maps/_map.scss +10 -10
  114. package/assets/sass/core/masks/_mask.scss +33 -33
  115. package/assets/sass/core/medias/_media-comment.scss +33 -33
  116. package/assets/sass/core/medias/_media.scss +3 -3
  117. package/assets/sass/core/mixins/_alert.scss +22 -22
  118. package/assets/sass/core/mixins/_background-variant.scss +30 -30
  119. package/assets/sass/core/mixins/_badge.scss +12 -12
  120. package/assets/sass/core/mixins/_buttons.scss +105 -105
  121. package/assets/sass/core/mixins/_custom-forms.scss +47 -47
  122. package/assets/sass/core/mixins/_forms.scss +127 -127
  123. package/assets/sass/core/mixins/_icon.scss +10 -10
  124. package/assets/sass/core/mixins/_modals.scss +25 -25
  125. package/assets/sass/core/mixins/_popover.scss +35 -35
  126. package/assets/sass/core/modals/_modal.scss +31 -31
  127. package/assets/sass/core/navbars/_navbar-collapse.scss +37 -37
  128. package/assets/sass/core/navbars/_navbar-dropdown.scss +121 -121
  129. package/assets/sass/core/navbars/_navbar-floating.scss +17 -17
  130. package/assets/sass/core/navbars/_navbar-search.scss +216 -216
  131. package/assets/sass/core/navbars/_navbar-top.scss +58 -58
  132. package/assets/sass/core/navbars/_navbar-vertical.scss +507 -507
  133. package/assets/sass/core/navbars/_navbar.scss +368 -368
  134. package/assets/sass/core/navs/_nav-pills.scss +66 -66
  135. package/assets/sass/core/navs/_nav.scss +33 -33
  136. package/assets/sass/core/paginations/_pagination.scss +49 -49
  137. package/assets/sass/core/popovers/_popover.scss +21 -21
  138. package/assets/sass/core/progresses/_progress.scss +89 -89
  139. package/assets/sass/core/reboot/_reboot.scss +13 -13
  140. package/assets/sass/core/sections/_nucleo-icons.scss +117 -117
  141. package/assets/sass/core/separators/_separator.scss +54 -54
  142. package/assets/sass/core/shortcuts/_shortcut.scss +30 -30
  143. package/assets/sass/core/tables/_table-actions.scss +25 -25
  144. package/assets/sass/core/tables/_table-sortable.scss +28 -28
  145. package/assets/sass/core/tables/_table.scss +153 -153
  146. package/assets/sass/core/timeline/_timeline.scss +182 -182
  147. package/assets/sass/core/type/_article.scss +22 -22
  148. package/assets/sass/core/type/_display.scss +14 -14
  149. package/assets/sass/core/type/_heading.scss +65 -65
  150. package/assets/sass/core/type/_type.scss +27 -27
  151. package/assets/sass/core/utilities/_backgrounds.scss +51 -51
  152. package/assets/sass/core/utilities/_blurable.scss +37 -37
  153. package/assets/sass/core/utilities/_floating.scss +64 -64
  154. package/assets/sass/core/utilities/_helper.scss +18 -18
  155. package/assets/sass/core/utilities/_image.scss +9 -9
  156. package/assets/sass/core/utilities/_opacity.scss +35 -35
  157. package/assets/sass/core/utilities/_overflow.scss +11 -11
  158. package/assets/sass/core/utilities/_position.scss +25 -25
  159. package/assets/sass/core/utilities/_shadows.scss +28 -28
  160. package/assets/sass/core/utilities/_sizing.scss +7 -7
  161. package/assets/sass/core/utilities/_spacing.scss +107 -107
  162. package/assets/sass/core/utilities/_text.scss +49 -49
  163. package/assets/sass/core/utilities/_transform.scss +13 -13
  164. package/assets/sass/core/vendors/_bootstrap-datepicker.scss +279 -279
  165. package/assets/sass/core/vendors/_bootstrap-tagsinput.scss +67 -67
  166. package/assets/sass/core/vendors/_chartjs.scss +22 -22
  167. package/assets/sass/core/vendors/_dropzone.scss +74 -74
  168. package/assets/sass/core/vendors/_element-checkbox.scss +26 -26
  169. package/assets/sass/core/vendors/_element-tables.scss +61 -61
  170. package/assets/sass/core/vendors/_flatpickr.scss +72 -72
  171. package/assets/sass/core/vendors/_fullcalendar.scss +256 -256
  172. package/assets/sass/core/vendors/_headroom.scss +25 -25
  173. package/assets/sass/core/vendors/_lavalamp.scss +157 -157
  174. package/assets/sass/core/vendors/_nouislider.scss +413 -413
  175. package/assets/sass/core/vendors/_quill.scss +280 -280
  176. package/assets/sass/core/vendors/_scrollbar.scss +949 -949
  177. package/assets/sass/core/vendors/_select.scss +70 -70
  178. package/assets/sass/core/vendors/_sweet-alert-2.scss +22 -22
  179. package/assets/sass/core/vendors/_tags.scss +32 -32
  180. package/assets/sass/core/vendors/_vectormap.scss +16 -16
  181. package/assets/sass/custom/_components.scss +142 -142
  182. package/assets/sass/custom/_functions.scss +29 -29
  183. package/assets/sass/custom/_mixins.scss +15 -15
  184. package/assets/sass/custom/_transitions.scss +12 -12
  185. package/assets/sass/custom/_utilities.scss +31 -31
  186. package/assets/sass/custom/_variables.scss +1077 -1077
  187. package/assets/sass/custom/_vendors.scss +38 -38
  188. package/components/argon-core/Badge.vue +56 -56
  189. package/components/argon-core/Banners/Banner.vue +28 -28
  190. package/components/argon-core/Banners/BannerItem.vue +13 -13
  191. package/components/argon-core/BaseAlert.vue +74 -74
  192. package/components/argon-core/BaseButton.vue +81 -81
  193. package/components/argon-core/BaseHeader.vue +21 -21
  194. package/components/argon-core/BasePagination.vue +172 -172
  195. package/components/argon-core/BaseProgress.vue +121 -121
  196. package/components/argon-core/BaseSlider.vue +96 -96
  197. package/components/argon-core/BaseSwitch.vue +46 -46
  198. package/components/argon-core/BaseTable.vue +70 -70
  199. package/components/argon-core/Breadcrumb/Breadcrumb.vue +26 -26
  200. package/components/argon-core/Breadcrumb/BreadcrumbItem.vue +16 -16
  201. package/components/argon-core/Breadcrumb/RouteBreadcrumb.vue +45 -45
  202. package/components/argon-core/ButtonCheckbox.vue +39 -39
  203. package/components/argon-core/ButtonRadioGroup.vue +47 -47
  204. package/components/argon-core/Cards/Card.vue +71 -71
  205. package/components/argon-core/Cards/OpportunityCard.vue +39 -39
  206. package/components/argon-core/Cards/StatsCard.vue +49 -49
  207. package/components/argon-core/Charts/BarChart.js +30 -30
  208. package/components/argon-core/Charts/DoughnutChart.js +30 -30
  209. package/components/argon-core/Charts/LineChart.js +30 -30
  210. package/components/argon-core/Charts/PieChart.js +30 -30
  211. package/components/argon-core/Charts/config.js +491 -491
  212. package/components/argon-core/Charts/globalOptionsMixin.js +7 -7
  213. package/components/argon-core/Charts/optionHelpers.js +10 -10
  214. package/components/argon-core/CloseButton.vue +35 -35
  215. package/components/argon-core/Collapse/Collapse.vue +84 -84
  216. package/components/argon-core/Collapse/CollapseItem.vue +91 -91
  217. package/components/argon-core/Feed/Comment.vue +50 -50
  218. package/components/argon-core/Inputs/BaseCheckbox.vue +79 -79
  219. package/components/argon-core/Inputs/BaseInput.vue +221 -221
  220. package/components/argon-core/Inputs/BaseRadio.vue +68 -68
  221. package/components/argon-core/Inputs/DropzoneFileUpload.vue +127 -127
  222. package/components/argon-core/Inputs/FileInput.vue +54 -54
  223. package/components/argon-core/Inputs/HtmlEditor.vue +105 -105
  224. package/components/argon-core/Inputs/IconCheckbox.vue +45 -45
  225. package/components/argon-core/Inputs/TagsInput.vue +100 -100
  226. package/components/argon-core/Navbar/BaseNav.vue +122 -122
  227. package/components/argon-core/Navbar/NavbarProgress.vue +19 -19
  228. package/components/argon-core/Navbar/NavbarProgressItem.vue +17 -17
  229. package/components/argon-core/Navbar/NavbarToggleButton.vue +21 -21
  230. package/components/argon-core/NavbarToggleButton.vue +29 -29
  231. package/components/argon-core/NotificationPlugin/Notification.vue +207 -207
  232. package/components/argon-core/NotificationPlugin/Notifications.vue +55 -55
  233. package/components/argon-core/NotificationPlugin/index.js +66 -66
  234. package/components/argon-core/SidebarPlugin/SideBar.vue +119 -119
  235. package/components/argon-core/SidebarPlugin/SidebarItem.vue +184 -184
  236. package/components/argon-core/SidebarPlugin/index.js +79 -79
  237. package/components/argon-core/Tabs/Tab.vue +33 -33
  238. package/components/argon-core/Tabs/Tabs.vue +170 -170
  239. package/components/argon-core/Timeline/TimeLine.vue +17 -17
  240. package/components/argon-core/Timeline/TimeLineItem.vue +30 -30
  241. package/components/argon-core/WorldMap/AsyncWorldMap.vue +28 -28
  242. package/components/argon-core/WorldMap/WorldMap.vue +127 -127
  243. package/components/argon-core/index.js +82 -82
  244. package/components/burh-ds/Avatar/AvatarLink.vue +40 -40
  245. package/components/burh-ds/Avatar/BusinessAvatar.vue +38 -38
  246. package/components/burh-ds/Banners/BannerHero.vue +23 -23
  247. package/components/burh-ds/Banners/BannerItem.vue +14 -14
  248. package/components/burh-ds/Button/ExportButton.vue +20 -20
  249. package/components/burh-ds/Button/SwitchStateButton.vue +165 -165
  250. package/components/burh-ds/Capsules/SearchSlug.vue +860 -860
  251. package/components/burh-ds/Capsules/UserProfile.vue +1938 -1938
  252. package/components/burh-ds/Cards/CampaignCard.vue +40 -40
  253. package/components/burh-ds/Cards/CompanyCard.vue +39 -39
  254. package/components/burh-ds/Cards/CourseInfoCard.vue +72 -72
  255. package/components/burh-ds/Cards/FunctionalityItem.vue +35 -35
  256. package/components/burh-ds/Cards/OpportunityCard.vue +115 -115
  257. package/components/burh-ds/Cards/PerformanceItem.vue +65 -65
  258. package/components/burh-ds/Cards/PlanCard.vue +192 -192
  259. package/components/burh-ds/Cards/ProductCard.vue +142 -142
  260. package/components/burh-ds/Cards/PurchaseCard.vue +58 -58
  261. package/components/burh-ds/Cards/PurchaseCardSimple.vue +58 -58
  262. package/components/burh-ds/Cards/TestCard.vue +189 -189
  263. package/components/burh-ds/Cards/TrainingCard.vue +151 -151
  264. package/components/burh-ds/Cards/WelcomeCard.vue +106 -106
  265. package/components/burh-ds/Carousel/FeedCarousel.vue +47 -47
  266. package/components/burh-ds/Carousel/ImageCarousel.vue +111 -111
  267. package/components/burh-ds/Collapse/DefaultCollapse.vue +70 -70
  268. package/components/burh-ds/Crop/Crop.vue +121 -121
  269. package/components/burh-ds/Curriculum/UserCurriculum/UpgradePlan.vue +74 -74
  270. package/components/burh-ds/Curriculum/UserCurriculum/UserCvRightSide.vue +198 -8
  271. package/components/burh-ds/Curriculum/UserCurriculum/UserCvRightSideNotAuth.vue +377 -0
  272. package/components/burh-ds/Curriculum/UserCurriculum/index.vue +249 -249
  273. package/components/burh-ds/Dropdown/AppLinkArea.vue +132 -132
  274. package/components/burh-ds/Dropdown/DropdownItem.vue +26 -26
  275. package/components/burh-ds/Dropdown/DropdownSection.vue +38 -38
  276. package/components/burh-ds/Dropdown/FaqVideoArea.vue +88 -88
  277. package/components/burh-ds/Dropdown/SignOutItem.vue +11 -11
  278. package/components/burh-ds/Dropdown/UserMenuDropdown.vue +63 -63
  279. package/components/burh-ds/FeaturedCompanies/FeaturedCompanies.vue +11 -11
  280. package/components/burh-ds/FeaturedCompanies/FeaturedCompanyCard.vue +16 -16
  281. package/components/burh-ds/Groups/ProductItem.vue +62 -62
  282. package/components/burh-ds/Groups/SimpleProductItem.vue +129 -129
  283. package/components/burh-ds/Headings/BaseHeader.vue +24 -24
  284. package/components/burh-ds/Headings/Profile.vue +66 -66
  285. package/components/burh-ds/Headings/ProfileHeader.vue +105 -105
  286. package/components/burh-ds/Headings/SettingsHeader.vue +48 -48
  287. package/components/burh-ds/Headings/StepHeader.vue +122 -122
  288. package/components/burh-ds/Input/AutoComplete.vue +136 -136
  289. package/components/burh-ds/Inputs/BaseCheckbox.vue +73 -73
  290. package/components/burh-ds/Inputs/BaseSwitch.vue +43 -43
  291. package/components/burh-ds/Inputs/BaseSwitchSecondary.vue +84 -84
  292. package/components/burh-ds/Inputs/DoubleInputWithIcon.vue +100 -100
  293. package/components/burh-ds/Inputs/HtmlEditor.vue +64 -64
  294. package/components/burh-ds/InterfaceSpa/InterfaceSpa.vue +83 -83
  295. package/components/burh-ds/Jobs/JobDetail.vue +432 -432
  296. package/components/burh-ds/Jobs/JobDetailDesign.vue +151 -151
  297. package/components/burh-ds/Jobs/JobDetailEmpty.vue +27 -27
  298. package/components/burh-ds/Labels/LabelContextIcon.vue +58 -58
  299. package/components/burh-ds/Link/DefaultLink.vue +30 -30
  300. package/components/burh-ds/Lists/ListAvatarCheckbox.vue +157 -157
  301. package/components/burh-ds/Lists/ListNavLinks.vue +54 -54
  302. package/components/burh-ds/Lists/VagasSimple.vue +404 -404
  303. package/components/burh-ds/Loadings/Basics.vue +80 -80
  304. package/components/burh-ds/Loadings/InfiniteLoading.vue +21 -21
  305. package/components/burh-ds/Loadings/LoadingFullPage.vue +68 -68
  306. package/components/burh-ds/Loadings/NewLoading.vue +119 -119
  307. package/components/burh-ds/Loads/LoadingBar.vue +83 -83
  308. package/components/burh-ds/Modals/AddCustomerModal.vue +206 -206
  309. package/components/burh-ds/Modals/AddMember.vue +301 -301
  310. package/components/burh-ds/Modals/AddRoleModal.vue +185 -185
  311. package/components/burh-ds/Modals/AppConfigModal.vue +390 -390
  312. package/components/burh-ds/Modals/CourseMessageModal.vue +66 -66
  313. package/components/burh-ds/Modals/DocsModal.vue +111 -111
  314. package/components/burh-ds/Modals/DropzoneModal.vue +123 -123
  315. package/components/burh-ds/Modals/InviteToRole.vue +217 -217
  316. package/components/burh-ds/Modals/MobileModal.vue +65 -65
  317. package/components/burh-ds/Modals/ModalTests.vue +167 -167
  318. package/components/burh-ds/Modals/PlanModal.vue +286 -286
  319. package/components/burh-ds/Modals/RequestModal.vue +281 -281
  320. package/components/burh-ds/Modals/SendDisc.vue +230 -230
  321. package/components/burh-ds/Modals/SendTest.vue +349 -349
  322. package/components/burh-ds/Modals/ShareModal.vue +228 -228
  323. package/components/burh-ds/Modals/SmsModal.vue +327 -327
  324. package/components/burh-ds/Modals/SubModal.vue +41 -41
  325. package/components/burh-ds/Modals/UniversityAccessModal.vue +133 -133
  326. package/components/burh-ds/Modals/VideoModal.vue +80 -80
  327. package/components/burh-ds/Modals/WhatsappModal.vue +143 -143
  328. package/components/burh-ds/Navbar/BaseNav.vue +132 -132
  329. package/components/burh-ds/Notifications/Notification.vue +215 -215
  330. package/components/burh-ds/Notifications/Notifications.vue +55 -55
  331. package/components/burh-ds/Notifications/index.js +66 -66
  332. package/components/burh-ds/Pagination/NamedPagination.vue +176 -176
  333. package/components/burh-ds/Questions/Question.vue +183 -183
  334. package/components/burh-ds/Questions/QuestionAttach.vue +13 -13
  335. package/components/burh-ds/Questions/QuestionRadio.vue +122 -122
  336. package/components/burh-ds/Questions/QuestionRadioItem.vue +83 -83
  337. package/components/burh-ds/Questions/QuestionText.vue +66 -66
  338. package/components/burh-ds/Questions/index.js +13 -13
  339. package/components/burh-ds/Skeleton/BaseCardTest.vue +51 -51
  340. package/components/burh-ds/Skeleton/BaseTraining.vue +29 -29
  341. package/components/burh-ds/Skeleton/BufferFolderSkeleton.vue +41 -41
  342. package/components/burh-ds/Skeleton/BufferUserSkeleton.vue +142 -142
  343. package/components/burh-ds/Skeleton/Home.vue +100 -100
  344. package/components/burh-ds/Tabs/Tab.vue +56 -56
  345. package/components/burh-ds/Tabs/Tabs.vue +188 -188
  346. package/components/burh-ds/Tabs/TesteTab.vue +106 -106
  347. package/components/burh-ds/index.js +20 -20
  348. package/components/layouts/argon/Content.vue +17 -17
  349. package/components/layouts/argon/navbar/BlankLayout.vue +61 -61
  350. package/components/layouts/argon/navbar/DashboardNavbar.vue +307 -307
  351. package/components/layouts/burh-ds/ContentFooter.vue +45 -45
  352. package/components/layouts/burh-ds/footer/FooterSimple.vue +20 -20
  353. package/components/layouts/burh-ds/footer/ProductsFooter.vue +330 -330
  354. package/components/layouts/burh-ds/footer/StatusFooter.vue +105 -105
  355. package/components/layouts/burh-ds/footer/StoreFooter.vue +54 -54
  356. package/components/layouts/burh-ds/navbar/AppNavbar.vue +97 -97
  357. package/components/layouts/burh-ds/navbar/BusinessGlobalNavbar.vue +435 -435
  358. package/components/layouts/burh-ds/navbar/CarreirasNavbar.vue +363 -363
  359. package/components/layouts/burh-ds/navbar/CompanyGlobalNavbar.vue +244 -244
  360. package/components/layouts/burh-ds/navbar/EmpresasNavbar.vue +374 -374
  361. package/components/layouts/burh-ds/navbar/EmpresasNavbarLogado.vue +388 -388
  362. package/components/layouts/burh-ds/navbar/GlobalNavbar.vue +535 -535
  363. package/components/layouts/burh-ds/navbar/MobileNavbar.vue +431 -431
  364. package/components/layouts/burh-ds/navbar/SimpleNavbar.vue +129 -129
  365. package/components/layouts/burh-ds/navbar/UserNavbar.vue +346 -346
  366. package/components/layouts/burh-ds/navbar/UserNavbarLogin.vue +253 -253
  367. package/components/pages/UserProfile/EditProfileForm.vue +142 -142
  368. package/components/pages/UserProfile/UserCard.vue +61 -61
  369. package/components/pages/dashboard/ActivityFeed.vue +102 -102
  370. package/components/pages/dashboard/LightTable.vue +194 -194
  371. package/components/pages/dashboard/PageVisitsTable.vue +107 -107
  372. package/components/pages/dashboard/ProgressTrackList.vue +82 -82
  373. package/components/pages/dashboard/SocialTrafficTable.vue +101 -101
  374. package/components/pages/dashboard/TaskList.vue +56 -56
  375. package/components/pages/dashboard/UserList.vue +72 -72
  376. package/components/pages/forms/BrowserDefaultsValidation.vue +106 -106
  377. package/components/pages/forms/CustomStylesValidation.vue +130 -130
  378. package/components/pages/forms/ServerSideValidation.vue +128 -128
  379. package/components/pages/register/FailedRegistration.vue +29 -29
  380. package/components/pages/register/SuccessfulRegistration.vue +29 -29
  381. package/components/tables/PaginatedTables/clientPaginationMixin.js +86 -86
  382. package/components/tables/RegularTables/CheckboxColoredTable.vue +112 -112
  383. package/components/tables/RegularTables/CheckboxTable.vue +101 -101
  384. package/components/tables/RegularTables/DarkTable.vue +114 -114
  385. package/components/tables/RegularTables/InlineActionsTable.vue +94 -94
  386. package/components/tables/RegularTables/LightTable.vue +117 -117
  387. package/components/tables/RegularTables/StripedTable.vue +94 -94
  388. package/components/tables/RegularTables/TranslucentTable.vue +114 -114
  389. package/components/tables/projects.js +75 -75
  390. package/components/tables/users.js +42 -42
  391. package/components/tables/users2.js +474 -474
  392. package/components/widgets/CalendarWidget.vue +119 -119
  393. package/components/widgets/CreditCard.vue +66 -66
  394. package/components/widgets/MembersCard.vue +99 -99
  395. package/components/widgets/PaypalCard.vue +45 -45
  396. package/components/widgets/ProgressTrackList.vue +76 -76
  397. package/components/widgets/StatsCards.vue +70 -70
  398. package/components/widgets/TaskList.vue +67 -67
  399. package/components/widgets/TimelineCard.vue +66 -66
  400. package/components/widgets/VectorMapCard.vue +139 -139
  401. package/components/widgets/VisaCard.vue +51 -51
  402. package/data/ListVideoLinksMock.json +21 -21
  403. package/dictionary.js +38 -38
  404. package/environment.env.md +34 -34
  405. package/eslint.config.json +12 -12
  406. package/layouts/AuthLayout.vue +191 -191
  407. package/layouts/BurhCarreirasLayout.vue +63 -63
  408. package/layouts/BurhEmpresasLayout.vue +64 -64
  409. package/layouts/BurhNoHeader.vue +63 -63
  410. package/layouts/BurhPublicLayout.vue +67 -67
  411. package/layouts/BurhUserLayout.vue +231 -231
  412. package/layouts/DashboardLayout.vue +226 -226
  413. package/layouts/error.vue +119 -119
  414. package/metadata.json +30 -30
  415. package/middleware/README.md +8 -8
  416. package/middleware/decodeUrl.js +8 -8
  417. package/middleware/maintenance.js +9 -9
  418. package/middleware/new-account.js +6 -6
  419. package/middleware/redirect.js +13 -13
  420. package/middleware/user-agent-error.js +28 -28
  421. package/package.json +112 -112
  422. package/plugins/README.md +7 -7
  423. package/plugins/analytics/ga.js +28 -28
  424. package/plugins/auth/auth.js +210 -210
  425. package/plugins/axios.js +32 -32
  426. package/plugins/carousel/owl-carousel.js +3 -3
  427. package/plugins/crop/crop.js +4 -4
  428. package/plugins/dashboard/dashboard-plugin.js +29 -29
  429. package/plugins/dashboard/directives/click-outside.js +15 -15
  430. package/plugins/dashboard/eventBus.js +1 -1
  431. package/plugins/dashboard/globalComponents.js +41 -41
  432. package/plugins/dashboard/globalDirectives.js +7 -7
  433. package/plugins/dom/loader.js +76 -76
  434. package/plugins/localstorage.js +20 -20
  435. package/plugins/location/location.js +41 -41
  436. package/plugins/pagination/pagination.js +3 -3
  437. package/plugins/qrcode/qrcode.js +4 -4
  438. package/plugins/router.js +8 -8
  439. package/plugins/social-media/fb-sdk.js +44 -44
  440. package/plugins/social-media/share-link-facebook.js +32 -32
  441. package/plugins/social-media/share-link-linkedin.js +30 -30
  442. package/plugins/social-media/share-link-twitter.js +30 -30
  443. package/plugins/social-media/share-link-whatsapp.js +31 -31
  444. package/polyfills.js +96 -96
  445. package/util/common.js +189 -189
  446. package/util/cookie.js +28 -28
  447. package/util/dom.js +63 -63
  448. package/util/getPrefixes.js +12 -12
  449. package/util/request.js +46 -46
  450. package/util/throttle.js +15 -15
@@ -1,1938 +1,1938 @@
1
- <template>
2
- <div v-show="loaded && (isCurrentUser() || !isCurrentUser() && !user.private)">
3
- <basics :isLoading="loading" v-if="loading"/>
4
- <client-only>
5
- <profile-header type="primary" :image="user.cover" :class="{'profile-edit': isCurrentUser()}">
6
- <template slot="cover-percentage">
7
- <h1
8
- class="cover-percentage"
9
- v-if="coverPercentCompleted != null"
10
- >{{coverPercentCompleted}}%</h1>
11
- </template>
12
- <template v-if="isCurrentUser() && coverPercentCompleted == null" slot="cover-percentage">
13
- <span
14
- :class="{'profile-edit__icon--edit': isEditing}"
15
- class="profile-edit__icon">
16
- <span class="profile-edit__text mr-md-4" title="Editar imagem de capa" v-on:click.prevent="onCoverClick();">
17
- <font-awesome-icon :icon="['fas', 'pen']" size="lg" /> Mudar imagem de capa
18
- </span>
19
- <span v-if="user.cover" class="profile-edit__text" title="Excluir imagem de capa" v-on:click.prevent="removeUserImage('banner');">
20
- <font-awesome-icon :icon="['fas', 'trash']" size="lg" /> Excluir imagem de capa
21
- </span>
22
- </span>
23
- </template>
24
- <div class="subheader__user col-12 col-md-8">
25
- <div class="subheader__avatar avatar rounded-circle">
26
- <img
27
- :src="user.avatar"
28
- :alt="user.name + ' ' + user.last_name"
29
- v-if="user.avatar != null && user.avatar != ''"
30
- />
31
- <span
32
- class="bigger"
33
- v-if="user.avatar == null || user.avatar == ''"
34
- >{{user.name.charAt(0)}}{{user.last_name.split(' ')[0].charAt(0)}}</span>
35
- <h1
36
- class="avatar-percentage"
37
- v-if="avatarPercentCompleted != null"
38
- >{{avatarPercentCompleted}}%</h1>
39
-
40
- <span
41
- :class="{'profile-edit__icon--edit': isEditing}"
42
- class="profile-edit__icon"
43
- v-if="isCurrentUser()"
44
- >
45
- <input
46
- ref="inputFile"
47
- type="file"
48
- @change="onAvatarChange($event)"
49
- class="profile-edit__caller"
50
- />
51
- <span v-on:click.prevent="onAvatarClick()" class="d-block mr-4 avatar-svg" title="Editar Avatar">
52
- <i class="fas fa-pen fa-lg"></i>
53
- <!-- <font-awesome-icon :icon="['fas', 'globe']" size="lg" v-on:click.self="onAvatarClick()" /> -->
54
- </span>
55
- <span v-if="user.avatar" v-on:click.prevent="removeUserImage('avatar')" class="d-block avatar-svg" title="Excluir Avatar">
56
- <i class="fas fa-trash fa-lg"></i>
57
- <!-- <font-awesome-icon :icon="['fas', 'trash']" size="lg" /> -->
58
- </span>
59
- </span>
60
-
61
- <div
62
- class="profile-pcd rounded-circle"
63
- v-if="$store.state.localStorage.currentCompany != null && !isCurrentUser() && user.deficiency != null"
64
- >
65
- <font-awesome-icon :icon="['fas', 'wheelchair']" />
66
- </div>
67
- </div>
68
- <div class="subheader__info">
69
- <h1 class="h1">
70
- {{user.name}} {{user.last_name}}
71
- <span
72
- class="badge badge-info badge-sm small badge-private"
73
- v-if="user.private"
74
- >Privado</span>
75
- <button
76
- v-if="isCurrentUser()"
77
- class="btn btn-link pl-1 pr-1 my-0 py-0"
78
- style="min-width: 40px"
79
- @click="openModal('information', modalInformationData())"
80
- >
81
- <font-awesome-icon :icon="['fas', 'pen']" />
82
- </button>
83
- </h1>
84
-
85
- <template v-if="currentJob() != null">
86
- <p class="ellipsis">{{currentJob().job_title}}</p>
87
- <p class="small">
88
- <span>no</span>
89
- {{currentJob().company}} em
90
- <b>{{currentJob().location}}</b>
91
- </p>
92
- </template>
93
- </div>
94
- </div>
95
- <div class="col-12 col-md-4 subheader__actions" id="subheader">
96
- <template v-if="isCurrentUser()">
97
- <base-dropdown
98
- :menuOnRight="true"
99
- direction="up"
100
- titleTag="Adicionar Nova Seção"
101
- class="add-fixed helper-fran"
102
- v-on:change="isActive = $event"
103
- >
104
- <div class="helper-fran__caller" slot="title-container">
105
- <span class="fran-avatar fran-avatar--mini">
106
- <img src="/img/content/fran/fran-00.svg" alt="Fran">
107
- </span>
108
- <div class="helper-fran__caller__text">
109
- Sou a Fran, posso te ajudar a adicionar itens ao seu perfil
110
- </div>
111
- <base-button
112
- type="primary"
113
- class="btn-rounded mt-0 mr-0 px-3 py-3"
114
- :class="{'active': isActive}"
115
- @click="toggleActive()"
116
- >
117
- <font-awesome-icon :icon="['fas', 'plus']" aria-label="Adicionar Nova Seção" />
118
- </base-button>
119
- </div>
120
- <li>
121
- <h4 class="h4 helper-fran__header">
122
- <span class="fran-avatar">
123
- <img src="/img/content/fran/fran-00.svg" alt="Fran">
124
- </span>
125
- Escolha a área que deseja adicionar ao seu perfil.
126
- </h4>
127
- </li>
128
- <li>
129
- <a :class="{'text-danger': !(user.complementary_information.about != null && user.complementary_information.about.length)}" class="dropdown-item" href="javascript:void(0);" @click="openModal('about', user.complementary_information.about)">
130
- <span class="dropdown-item__icon">
131
- <font-awesome-icon :icon="['fas', 'user']" />
132
- </span>
133
- Sobre
134
- <span class="dropdown-item__icon">
135
- <font-awesome-icon v-if="user.complementary_information.about != null && user.complementary_information.about.length" :icon="['fas', 'check']" class="text-success"></font-awesome-icon>
136
- <font-awesome-icon v-else :icon="['fas', 'times']" class="text-danger"></font-awesome-icon>
137
- </span>
138
- </a>
139
- </li>
140
- <li>
141
- <a :class="{'text-danger': user.experience != [] && user.experience.length == 0}" class="dropdown-item" href="javascript:void(0);" @click="openModal('experience')">
142
- <span class="dropdown-item__icon">
143
- <font-awesome-icon :icon="['fas', 'suitcase']" />
144
- </span>
145
- Experiência Profissional
146
- <span class="dropdown-item__icon">
147
- <font-awesome-icon v-if="user.experience != [] && user.experience.length != 0" :icon="['fas', 'check']" class="text-success"></font-awesome-icon>
148
- <font-awesome-icon v-else :icon="['fas', 'times']" class="text-danger"></font-awesome-icon>
149
- </span>
150
- </a>
151
- </li>
152
- <li>
153
- <a :class="{'text-danger': user.education != [] && user.education.length == 0}" class="dropdown-item" href="javascript:void(0);" @click="openModal('education')">
154
- <span class="dropdown-item__icon">
155
- <font-awesome-icon :icon="['fas', 'user-graduate']" />
156
- </span>
157
- Educação
158
- <span class="dropdown-item__icon">
159
- <font-awesome-icon v-if="user.education != [] && user.education.length != 0" :icon="['fas', 'check']" class="text-success"></font-awesome-icon>
160
- <font-awesome-icon v-else :icon="['fas', 'times']" class="text-danger"></font-awesome-icon>
161
- </span>
162
- </a>
163
- </li>
164
- <li>
165
- <a :class="{'text-danger': user.course != [] && user.course.length == 0}" class="dropdown-item" href="javascript:void(0);" @click="openModal('courses')">
166
- <span class="dropdown-item__icon">
167
- <font-awesome-icon :icon="['fas', 'university']" />
168
- </span>
169
- Cursos Profissionalizantes
170
- <span class="dropdown-item__icon">
171
- <font-awesome-icon v-if="user.course != [] && user.course.length != 0" :icon="['fas', 'check']" class="text-success"></font-awesome-icon>
172
- <font-awesome-icon v-else :icon="['fas', 'times']" class="text-danger"></font-awesome-icon>
173
- </span>
174
- </a>
175
- </li>
176
- <li>
177
- <a :class="{'text-danger': user.skill != [] && user.skill.length == 0}" class="dropdown-item" href="javascript:void(0);" @click="openModal('skills')">
178
- <span class="dropdown-item__icon">
179
- <font-awesome-icon :icon="['fas', 'award']" />
180
- </span>
181
- Habilidades
182
- <span class="dropdown-item__icon">
183
- <font-awesome-icon v-if="user.skill != [] && user.skill.length != 0" :icon="['fas', 'check']" class="text-success"></font-awesome-icon>
184
- <font-awesome-icon v-else :icon="['fas', 'times']" class="text-danger"></font-awesome-icon>
185
- </span>
186
- </a>
187
- </li>
188
- <li>
189
- <a :class="{'text-danger': user.language != [] && user.language.length == 0}" class="dropdown-item" href="javascript:void(0);" @click="openModal('languages')">
190
- <span class="dropdown-item__icon">
191
- <font-awesome-icon :icon="['fas', 'globe']" />
192
- </span>
193
- Idiomas
194
- <span class="dropdown-item__icon">
195
- <font-awesome-icon v-if="user.language != [] && user.language.length != 0" :icon="['fas', 'check']" class="text-success"></font-awesome-icon>
196
- <font-awesome-icon v-else :icon="['fas', 'times']" class="text-danger"></font-awesome-icon>
197
- </span>
198
- </a>
199
- </li>
200
- <li>
201
- <a :class="{'text-danger': !isUserHasPhoneNumber || !isUserHasAddress}" class="dropdown-item" href="javascript:void(0);" @click="openModal('information', modalInformationData())">
202
- <span class="dropdown-item__icon">
203
- <font-awesome-icon :icon="['fas', 'address-card']" />
204
- </span>
205
- Dados Gerais
206
- <span class="dropdown-item__icon">
207
- <font-awesome-icon v-if="isUserHasPhoneNumber && isUserHasAddress" :icon="['fas', 'check']" class="text-success"></font-awesome-icon>
208
- <font-awesome-icon v-else :icon="['fas', 'times']" class="text-danger"></font-awesome-icon>
209
- </span>
210
- </a>
211
- </li>
212
- </base-dropdown>
213
- <!-- só mobile -->
214
- <button
215
- class="btn btn-outline-primary btn-hide-icon d-block d-sm-none"
216
- @click="onShareUserProfile()"
217
- >
218
- <span class="icon-mobile">
219
- <font-awesome-icon :icon="['fas', 'link']" />
220
- </span> Compartilhar
221
- </button>
222
- <!-- /só mobile -->
223
- <!-- <button class="btn btn-outline-primary btn-hide-icon" @click="toggleEdit()"> -->
224
- <button class="btn btn-sm btn-outline-primary px-4 btn-hide-icon" @click="openModal('information', modalInformationData())">
225
- <span class="icon-mobile">
226
- <font-awesome-icon :icon="['fas', 'pen']" />
227
- </span>
228
- <font-awesome-icon :icon="['fas', 'pen']" class="d-none d-sm-inline-block mr-2" />
229
- Dados Pessoais
230
- </button>
231
- <!-- <button class="btn btn-outline-primary btn-hide-icon d-none d-sm-block">
232
- <span class="icon-mobile"><font-awesome-icon :icon="['fas', 'pen']" /></span> Compartilhar
233
- </button>-->
234
- <base-dropdown :menuOnRight="true" direction class="d-none d-sm-block">
235
- <base-button
236
- slot="title-container"
237
- type="outline-primary"
238
- class="mt-0 mr-0 btn-rounded btn-ellipsis"
239
- >
240
- <font-awesome-icon :icon="['fas', 'ellipsis-h']" />
241
- </base-button>
242
- <button class="dropdown-item" @click="onShareUserProfile()">
243
- <font-awesome-icon :icon="['fas', 'link']" />Compartilhar
244
- </button>
245
- <button class="dropdown-item" @click="onDownloadProfile()">
246
- <font-awesome-icon :icon="['fas', 'print']" />Imprimir Currículo
247
- </button>
248
- </base-dropdown>
249
- </template>
250
- <template v-if="!isCurrentUser()">
251
- <!-- só mobile -->
252
- <!-- <button class="btn btn-outline-primary btn-hide-icon d-block d-sm-none">
253
- <span class="icon-mobile"><font-awesome-icon :icon="['fas', 'print']" /></span> Imprimir
254
- </button>-->
255
- <!-- /só mobile -->
256
- <button class="btn btn-outline-primary btn-hide-icon" @click="onShareUserProfile()">
257
- <span class="icon-mobile">
258
- <font-awesome-icon :icon="['fas', 'link']" />
259
- </span> Compartilhar
260
- </button>
261
- <!-- <button class="btn btn-outline-primary btn-hide-icon d-none d-sm-block">
262
- <span class="icon-mobile"><font-awesome-icon :icon="['fas', 'pen']" /></span> Compartilhar
263
- </button>-->
264
- <base-dropdown v-if="$store.state.localStorage.currentUser != null" :menuOnRight="true" class="d-none d-sm-block">
265
- <base-button
266
- slot="title-container"
267
- type="outline-primary"
268
- class="mt-0 mr-0 btn-rounded btn-ellipsis"
269
- >
270
- <font-awesome-icon :icon="['fas', 'ellipsis-h']" />
271
- </base-button>
272
- <!-- <a class="dropdown-item" href="#"><font-awesome-icon :icon="['fas', 'link']" /> Compartilhar</a> -->
273
- <button class="dropdown-item" @click="onDownloadProfile()">
274
- <font-awesome-icon :icon="['fas', 'print']" />Imprimir Currículo
275
- </button>
276
- </base-dropdown>
277
- </template>
278
- </div>
279
- </profile-header>
280
- <div
281
- id="profilePageContent"
282
- class="page-content page-content--transparent py-2 py-md-4 container-fluid container-fluid--bu"
283
- >
284
- <div class="row">
285
- <div class="col-12 col-md-7 col-lg-8">
286
- <div v-if="isCurrentUser()" class="profile-bar mb-5 border p-3">
287
- <span>
288
- Força do Perfil:
289
- <b v-if="profile_completion < 60">Iniciante</b>
290
- <b v-if="profile_completion >= 60 && profile_completion < 75">Intermediário</b>
291
- <b v-if="profile_completion >= 75 && profile_completion < 85">Avançado</b>
292
- <b v-if="profile_completion >= 85 && profile_completion < 90">Incrível</b>
293
- <b v-if="profile_completion >= 90">Fantástico</b>
294
- </span>
295
-
296
- <base-progress
297
- class="progress-xs mb-5 mt-3"
298
- :height="20"
299
- :type="'color-primary'"
300
- :value="profile_completion"
301
- :gradient="true"
302
- ></base-progress>
303
-
304
- <!-- {{$store.state.localStorage.currentUser.profile_completion}} -->
305
-
306
- <div class="profile-tips" v-if="$store.state.localStorage.currentUser.profile_completion > 10 && $store.state.localStorage.currentUser.profile_completion < 80">
307
- <p class="small">Para se candidatar a uma vaga você precisa preencher o seu cadastro até o nível <b>Intermediário</b> . </p>
308
- <p class="small">Clique e preencha os itens das categorias abaixo:</p>
309
-
310
- <ul class="list-unstyled small">
311
- <li class="btn btn-sm btn-link d-block my-2 mx-0 px-2 text-left pointer" @click="openModal('experience')" v-if="user.experience == null || user.experience.length == 0">
312
- <font-awesome-icon :icon="['fas', 'suitcase']" v-if="user.experience == null || user.experience.length == 0" /> Experiência Profissional
313
- </li>
314
- <li class="btn btn-sm btn-link d-block my-2 mx-0 px-2 text-left pointer" @click="openModal('education')" v-if="user.education == null || user.education.length == 0">
315
- <font-awesome-icon :icon="['fas', 'user-graduate']" /> Educação
316
- </li>
317
- <li class="btn btn-sm btn-link d-block my-2 mx-0 px-2 text-left pointer" @click="openModal('courses')" v-if="user.course == null || user.course.length == 0">
318
- <font-awesome-icon :icon="['fas', 'university']" /> Cursos Profissionalizantes
319
- </li>
320
- <li class="btn btn-sm btn-link d-block my-2 mx-0 px-2 text-left pointer" @click="openModal('skills')" v-if="user.skill == null || user.skill.length == 0">
321
- <font-awesome-icon :icon="['fas', 'award']" /> Habilidades
322
- </li>
323
- <li class="btn btn-sm btn-link d-block my-2 mx-0 px-2 text-left pointer" @click="openModal('languages')" v-if="user.language == null || user.language.length == 0">
324
- <font-awesome-icon :icon="['fas', 'globe']" /> Idiomas
325
- </li>
326
- </ul>
327
- </div>
328
-
329
- <div class="jobs-history" v-if="job != null">
330
- <div class="row">
331
- <div class="col-12 col-lg-6">
332
- <div class="card card--job cursor-pointer z-0 mb-4 mb-lg-0">
333
- <div class="card-header">
334
- <span class="avatar rounded-circle">
335
- <img
336
- alt
337
- :src="job.company_logo"
338
- onerror="this.src=''"
339
- />
340
- </span>
341
- </div>
342
- <div class="card-body">
343
- <span class="card__company">{{job.company_name}}</span>
344
- <h5 class="card-title">{{job.job_title}}</h5>
345
- <span class="card__local">
346
- {{job.city_name}}
347
- </span>
348
-
349
- <p class="card__published w-100">{{fromNow(job.created_at)}}</p>
350
- <button class="btn btn-xs btn-outline-primary" @click.prevent="$router.push('/vagas/' + job.job_id)">Ver detalhes</button>
351
- </div>
352
- </div>
353
- </div>
354
- <div class="col-12 col-lg-6 d-flex flex-wrap align-items-end text-left">
355
- <h2 class="h6 w-100 mb-0"><b>Complete seu perfil para a vaga!</b></h2>
356
- <p class="small">Para se candidatar a uma vaga você precisa preencher o seu cadastro até o nível <b>Intermediário</b> . </p>
357
- <p class="small">Quanto mais informações no seu perfil, maiores são as chances do selecionador chamá-lo para uma entrevista.</p>
358
- <button @click.prevent="applyToJob()" class="btn btn-sm my-2" :class="{'btn-outline-disabled': profile_completion < 60, 'btn-primary': profile_completion >= 60}" :disabled="profile_completion < 60">Candidatar-se agora</button>
359
- </div>
360
- </div>
361
- </div>
362
-
363
- <div class="profile-bar__tip">
364
- <el-tooltip content="Clique e veja todos os itens que podem ser adicionados em seu perfil." placement="bottom">
365
- <a href="javascript:void(0);" class="small" @click="toggleEdit()">
366
- <template v-if="switches.helpProfile">
367
- <font-awesome-icon :icon="['fas', 'toggle-on']" size="lg" />
368
- Ocultar
369
- </template>
370
- <template v-else>
371
- <font-awesome-icon :icon="['fas', 'toggle-off']" size="lg" />
372
- Mostrar
373
- </template>
374
-
375
- Ajuda de Preenchimento
376
- </a>
377
- </el-tooltip>
378
- </div>
379
- </div>
380
-
381
- <div
382
- :class="isCurrentUser() && isEditing == false && $store.state.localStorage.currentUser.profile_completion <= 10 ? '' : 'closed'"
383
- class="card card--animate bg-lighter mt-5"
384
- >
385
- <div class="card-body">
386
- <h3 class="h3">
387
- Boas vindas
388
- <b>{{user.name}} {{user.last_name}}</b>!
389
- </h3>
390
- <p>Agora que você fez seu cadastro no Burh é necessário preencher seus dados abaixo para participar de processos seletivo.s</p>
391
- <p>Lembre-se que quanto mais informações você colocar e quanto mais elas forem detalhadas, maiores são suas chances de contratação.</p>
392
- <p>Portanto, capriche em seu perfil e, para fechar com chave de ouro, adicione uma foto e uma imagem de capa - afinal, isso demonstra sua preocupação com os detalhes.</p>
393
- <button
394
- class="btn btn-primary btn-auto"
395
- @click="toggleEdit()"
396
- >Preencha agora seu perfil</button>
397
- </div>
398
- </div>
399
-
400
- <div
401
- class="box-zone"
402
- :class="{
403
- 'box-zone--edit': isCurrentUser()
404
- }"
405
- v-if="user.complementary_information != null && user.complementary_information.about != null && user.complementary_information.about.trim() != '' || isEditing == true"
406
- >
407
- <h2 class="h2">
408
- Sobre
409
- <button
410
- v-if="isCurrentUser()"
411
- class="btn btn-link"
412
- @click="openModal('about', user.complementary_information.about)"
413
- >
414
- <font-awesome-icon :icon="['fas', 'pen']" />
415
- </button>
416
- </h2>
417
- <div
418
- class="p-4 bg-lightest"
419
- v-if="isEditing == true && user.complementary_information.about == null || user.complementary_information.about.trim() == ''"
420
- >
421
- <p>Conte-nos um pouco sobre você. Pode ser um texto curtinho, explicando o que você faz ou procura - não precisa ser uma super apresentação. Veja o exemplo:</p>
422
- <p class="mb-0">
423
- <i>Eu sou a Fran. Trabalho com atendimento e satisfação do cliente. Gosto muito da área de humanas e sou formada em Comunicação Social. Acredito que meu trabalho pode modificar o mundo e direciono com o lema "não basta trabalhar, é preciso ser agende de mudanças positivas".</i>
424
- </p>
425
- <button
426
- class="btn btn-link btn-sm px-0 w-auto mb-0"
427
- @click="openModal('about', user.complementary_information.about)"
428
- >
429
- <font-awesome-icon :icon="['fas', 'plus']" /> Adicionar descrição
430
- </button>
431
- </div>
432
- <pre class="default-text default-text--pre">{{user.complementary_information.about}}</pre>
433
- </div>
434
- <div
435
- class="box-zone"
436
- :class="{
437
- 'box-zone--edit': isCurrentUser()
438
- }"
439
- v-if="user.experience != null && user.experience.length > 0 || isEditing == true"
440
- >
441
- <h2 class="h2">
442
- Experiência Profissional
443
- <button
444
- v-if="isCurrentUser()"
445
- class="btn btn-link"
446
- @click="openModal('experience')"
447
- >
448
- <font-awesome-icon :icon="['fas', 'plus']" /> Adicionar
449
- </button>
450
- </h2>
451
- <div class="p-4 bg-lightest" v-if="isEditing == true && user.experience.length == 0">
452
- <p
453
- class="mb-0"
454
- >Adicione as suas experiências de trabalho. Pode ser estágio, trabalhos temporários e até mesmo projetos PJ que você ache relavantes. Esse é o espaço para você falar sobre itens que formaram sua carreira até o momento.</p>
455
- <button
456
- class="btn btn-link btn-sm px-0 w-auto mb-0"
457
- @click="openModal('experience')"
458
- >
459
- <font-awesome-icon :icon="['fas', 'plus']" /> Adicionar Experiência
460
- </button>
461
- </div>
462
- <div
463
- :class="{'box-profile--edit': isCurrentUser()}"
464
- class="box-profile"
465
- v-for="(job, index) in sortUserExperience()"
466
- v-bind:key="index"
467
- @click="isCurrentUser() ? openModal('experience', job, index) : ''"
468
- >
469
- <div class="box-profile__header">
470
- <h3 class="h3">
471
- {{job.job_title}}
472
- <button
473
- v-if="isCurrentUser()"
474
- class="btn btn-link"
475
- >
476
- <font-awesome-icon :icon="['fas', 'pen']" />
477
- </button>
478
- </h3>
479
- <p>{{job.company}} - {{job.location}}</p>
480
- <p class="small">
481
- {{formatNumberDate(job.start_month, job.start_year)}} {{job.end_month != null && job.end_year != null ? ' - '+ formatNumberDate(job.end_month, job.end_year) : '' }}
482
- <template v-if="job.current == 1">(emprego atual)</template>
483
- </p>
484
- </div>
485
- <div
486
- class="box-profile__body"
487
- v-if="job.description != null && job.description != ''"
488
- >
489
- <p>{{job.description}}</p>
490
- </div>
491
- </div>
492
- </div>
493
- <div
494
- class="box-zone"
495
- :class="{
496
- 'box-zone--edit': isCurrentUser()
497
- }"
498
- v-if="user.education != null && user.education.length > 0 || isEditing == true"
499
- >
500
- <h2 class="h2">
501
- Educação
502
- <button
503
- v-if="isCurrentUser()"
504
- class="btn btn-link"
505
- @click="openModal('education')"
506
- >
507
- <font-awesome-icon :icon="['fas', 'plus']" /> Adicionar
508
- </button>
509
- </h2>
510
- <div class="p-4 bg-lightest" v-if="isEditing == true && user.education.length == 0">
511
- <p>Coloque suas formações acadêmicas aqui.</p>
512
- <p class="mb-0">
513
- <b>Dica:</b> insira as formações mais altas e coloque cursos superiores adicionais. Deixe cursos extras para o item "Cursos Profissionalizantes".
514
- </p>
515
- <button
516
- class="btn btn-link btn-sm px-0 w-auto mb-0"
517
- @click="openModal('education')"
518
- >
519
- <font-awesome-icon :icon="['fas', 'plus']" /> Adicionar Formação
520
- </button>
521
- </div>
522
- <div
523
- :class="{'box-profile--edit': isCurrentUser()}"
524
- class="box-profile"
525
- v-for="(education, index) in sortUserEducation()"
526
- v-bind:key="index"
527
- @click="isCurrentUser() ? openModal('education', education, index) : ''"
528
- >
529
- <div class="box-profile__header">
530
- <h3 class="h3">
531
- {{education.formation}}
532
- <button
533
- v-if="isCurrentUser()"
534
- class="btn btn-link"
535
- >
536
- <font-awesome-icon :icon="['fas', 'pen']" />
537
- </button>
538
- </h3>
539
- <p>{{education.institution}} - {{education.location}}</p>
540
- <p>
541
- {{formatNumberDate(education.start_month, education.start_year)}}
542
- <template
543
- v-if="education.end_year == null"
544
- >(estudando)</template>
545
- <template
546
- v-if="education.end_year != null"
547
- >- {{formatNumberDate(education.end_month, education.end_year)}}</template>
548
- </p>
549
- </div>
550
- </div>
551
- </div>
552
- <div
553
- class="box-zone"
554
- :class="{
555
- 'box-zone--edit': isCurrentUser()
556
- }"
557
- v-if="user.course != null && user.course.length > 0 || isEditing == true"
558
- >
559
- <h2 class="h2">
560
- Cursos e Certificados
561
- <button
562
- v-if="isCurrentUser()"
563
- class="btn btn-link"
564
- @click="openModal('courses')"
565
- >
566
- <font-awesome-icon :icon="['fas', 'plus']" />Adicionar
567
- </button>
568
- </h2>
569
- <div class="p-4 bg-lightest" v-if="isEditing == true && user.course.length == 0">
570
- <p
571
- class="mb-0"
572
- >Coloque outros cursos que você realizou e são extra-curriculares. Coloque aqui formações como "Libras", "Curso Extensivo para Metrologia", etc.</p>
573
- <button class="btn btn-link btn-sm px-0 w-auto mb-0" @click="openModal('courses')">
574
- <font-awesome-icon :icon="['fas', 'plus']" /> Adicionar Curso ou Certificado
575
- </button>
576
- </div>
577
- <div
578
- :class="{'box-profile--edit': isCurrentUser()}"
579
- class="box-profile"
580
- v-for="(course, index) in sortUserCourse()"
581
- v-bind:key="index"
582
- @click="isCurrentUser() ? openModal('courses', course, index) : ''"
583
- >
584
- <div class="box-profile__header">
585
- <h3 class="h3">
586
- {{course.name}}
587
- <button
588
- v-if="isCurrentUser()"
589
- class="btn btn-link"
590
- >
591
- <font-awesome-icon :icon="['fas', 'pen']" />
592
- </button>
593
- </h3>
594
- <p>{{course.institution}}</p>
595
- <p>
596
- <template
597
- v-if="formatNumberDate(course.start_month, course.start_year) != null"
598
- >
599
- {{formatNumberDate(course.start_month, course.start_year)}}
600
- <template
601
- v-if="course.period != null && course.period > 0 && course.current == 0"
602
- >({{course.period}} horas)</template>
603
- </template>
604
-
605
- <template
606
- v-if="formatNumberDate(course.start_month, course.start_year) == null"
607
- >{{course.period}} horas</template>
608
-
609
- <template v-if="course.current == 1">(estudando)</template>
610
- <template
611
- v-if="course.current == 0 && formatNumberDate(course.end_month, course.end_year) != null && formatNumberDate(course.start_month, course.start_year) != null"
612
- >até {{formatNumberDate(course.end_month, course.end_year)}}</template>
613
- </p>
614
- </div>
615
- </div>
616
- </div>
617
- <div
618
- class="box-zone"
619
- :class="{
620
- 'box-zone--edit': isCurrentUser()
621
- }"
622
- v-if="user.skill != null && user.skill.length > 0 || isEditing == true"
623
- >
624
- <h2 class="h2">
625
- Habilidades
626
- <button
627
- v-if="isCurrentUser()"
628
- class="btn btn-link"
629
- @click="openModal('skills')"
630
- >
631
- <font-awesome-icon :icon="['fas', 'plus']" /> Adicionar
632
- </button>
633
- </h2>
634
- <div class="p-4 bg-lightest" v-if="isEditing == true && user.skill.length == 0" @click="openModal('skills')">
635
- <p
636
- class="mb-0"
637
- >Adicione habilidades que você acha relevantes. Podem ser itens relacionados a especificações de cargo, habilidades humanas ou resumos de certificados.</p>
638
- <button class="btn btn-link btn-sm px-0 w-auto mb-0">
639
- <font-awesome-icon :icon="['fas', 'plus']" /> Adicionar Habilidades
640
- </button>
641
- </div>
642
- <ul class="list-inline">
643
- <li
644
- class="list-inline-item"
645
- v-for="(skill, index) in user.skill"
646
- v-bind:key="index"
647
- >
648
- <button
649
- class="tag tag-outline-default"
650
- :class="{
651
- 'tag-static': !isCurrentUser()
652
- }"
653
- >
654
- {{skill.name}}
655
- <font-awesome-icon
656
- :icon="['fas', 'trash']"
657
- @click="deleteSkill(skill.skill_id, index, skill.name)"
658
- />
659
- </button>
660
- </li>
661
- </ul>
662
- </div>
663
- <div
664
- class="box-zone"
665
- :class="{
666
- 'box-zone--edit': isCurrentUser()
667
- }"
668
- v-if="user.language != null && user.language.length > 0 || isEditing == true"
669
- >
670
- <h2 class="h2">
671
- Idiomas
672
- <button
673
- v-if="isCurrentUser()"
674
- class="btn btn-link"
675
- @click="openModal('languages')"
676
- >
677
- <font-awesome-icon :icon="['fas', 'plus']" /> Adicionar
678
- </button>
679
- </h2>
680
- <div class="p-4 bg-lightest" v-if="isEditing == true && user.language.length == 0">
681
- <p class="mb-0">
682
- Insira aqui os idiomas que você tem proeficiência, mas evite colocar seu idioma nativo se você está morando no país.
683
- <b>Exemplo:</b> Evite colocar
684
- <em>Português - Fluente</em>.
685
- </p>
686
- <button
687
- class="btn btn-link btn-sm px-0 w-auto mb-0"
688
- @click="openModal('languages')"
689
- >
690
- <font-awesome-icon :icon="['fas', 'plus']" /> Adicionar Curso ou Certificado
691
- </button>
692
- </div>
693
- <div class="row">
694
- <div
695
- class="col-12 col-sm-6"
696
- v-for="(language, index) in user.language"
697
- v-bind:key="index"
698
- >
699
- <div class="box-image mb-4" :class="{'box-image--edit': isCurrentUser()}"
700
- @click="isCurrentUser() ? openModal('languages', language, index) : '' ">
701
- <div class="box-image__brand avatar avatar-md rounded-circle">
702
- <span
703
- class="flag-icon flag-icon-squared"
704
- :class="textToFlagClass(language.language)"
705
- ></span>
706
- </div>
707
- <div class="box-image__description">
708
- <h3 class="h3">
709
- {{language.language}}
710
- <button
711
- v-if="isCurrentUser()"
712
- class="btn btn-link"
713
- @click="openModal('languages', language, index)"
714
- >
715
- <font-awesome-icon :icon="['fas', 'pen']" />
716
- </button>
717
- </h3>
718
- <p>{{languageLevel(language.level)}}</p>
719
- </div>
720
- </div>
721
- </div>
722
- </div>
723
- </div>
724
- </div>
725
- <div class="col-12 col-md-4 col-lg-3 offset-md-1 offset-lg-1">
726
- <div class="box-zone">
727
- <h2 class="h2">Comunidade</h2>
728
- <div class="row box-zone__community">
729
- <div class="col-3 col-lg-6">
730
- <strong>{{user.social.following}}</strong>
731
- seguindo
732
- </div>
733
- <div class="col-3 col-lg-6">
734
- <strong>{{user.social.followers}}</strong>
735
- seguidores
736
- </div>
737
- </div>
738
- </div>
739
- <div class="box-zone">
740
- <h2 class="h2">Links
741
- <button
742
- v-if="isCurrentUser()"
743
- class="btn btn-link pl-1 pr-1 my-0 py-0"
744
- style="min-width: 40px"
745
- @click="openModal('links', modalLinksData())"
746
- >
747
- <font-awesome-icon :icon="['fas', 'pen']" />
748
- </button>
749
- </h2>
750
- <ul class="list-unstyled">
751
- <li
752
- class="pb-3"
753
- v-if="user.complementary_information != null && user.complementary_information.twitter_url != null"
754
- >
755
- <a :href="user.complementary_information.twitter_url" target="_blank">
756
- <i class="fab fa-twitter"></i>
757
- Twitter
758
- </a>
759
- </li>
760
- <li
761
- class="pb-3"
762
- v-if="user.complementary_information != null && user.complementary_information.facebook_url != null"
763
- >
764
- <a :href="user.complementary_information.facebook_url" target="_blank">
765
- <i class="fab fa-facebook"></i> Facebook
766
- </a>
767
- </li>
768
- <li
769
- class="pb-3"
770
- v-if="user.complementary_information != null && user.complementary_information.linkedin_url != null"
771
- >
772
- <a :href="user.complementary_information.linkedin_url" target="_blank">
773
- <i class="fab fa-linkedin"></i> Linkedin
774
- </a>
775
- </li>
776
- <li
777
- class="pb-3"
778
- v-if="user.complementary_information != null && user.complementary_information.website != null"
779
- >
780
- <a :href="user.complementary_information.website" target="_blank">
781
- <i class="fas fa-globe"></i> Website
782
- </a>
783
- </li>
784
- </ul>
785
- <div class="qr-code">
786
- <qrcode
787
- :value="baseUrl + '/' + $route.params.id"
788
- :options="{ width: 128, height: 128 }"
789
- class="border"
790
- ></qrcode>
791
- <h3 class="h3">Código BURH</h3>
792
- <p>
793
- <strong>{{user.user_id}}</strong>
794
- </p>
795
- </div>
796
- </div>
797
- </div>
798
- </div>
799
- </div>
800
-
801
- <share-modal :show="modals" :url="linkShare" />
802
-
803
- <burh-modals
804
- :render="['name', 'about','experience','education','courses','skills','languages','information', 'links', 'address', 'phone']"
805
- :active="activeModal"
806
- :data="userData"
807
- :index="index"
808
- v-on:modal-close="clearActive($event)"
809
- v-on:updatedOtherInformations="setUpdatedOtherInformations($event)"
810
- v-on:updatedLinks="setUserLinks($event)"
811
- v-on:updateName="user.name = $event"
812
- v-on:updateLastName="user.last_name = $event"
813
- v-on:updateAbout="user.complementary_information.about = $event"
814
- v-on:addExperience="user.experience.unshift($event)"
815
- v-on:updateExperience="user.experience[$event.index] = $event"
816
- v-on:deleteExperiences="deleteThisExperience($event.index)"
817
- v-on:addEducation="user.education.unshift($event)"
818
- v-on:updateEducation="user.education[$event.index] = $event"
819
- v-on:deleteEducations="deleteThisEducation($event.index)"
820
- v-on:addCourses="user.course.unshift($event)"
821
- v-on:updateCourses="user.course[$event.index] = $event"
822
- v-on:deleteCourses="deleteThisCourse($event.index)"
823
- v-on:addSkill="user.skill.unshift($event)"
824
- v-on:addLanguages="user.language.unshift($event)"
825
- v-on:updateLanguages="user.language[$event.index] = $event"
826
- v-on:deleteLanguage="deleteLanguage($event.index)"
827
- v-on:updateUserInfo="updateUserInfo()"
828
- ></burh-modals>
829
-
830
- <crop
831
- v-if="fileImageBase64 != null"
832
- :show="modals.crop"
833
- :type="cropType"
834
- :file="fileImageBase64"
835
- v-on:cancel="fileImageBase64 = null; modals.crop = false"
836
- v-on:image-cropped="onImageCropped($event)"
837
- ></crop>
838
- </client-only>
839
- </div>
840
- </template>
841
- <script>
842
- // import { isMobile, isMobileOnly } from 'mobile-device-detect';
843
- import { isMobileOnly } from 'mobile-device-detect';
844
- import ProfileHeader from '~/components/burh-ds/Headings/ProfileHeader.vue';
845
- import { Crop } from '~/components/burh-ds';
846
- import https from 'https';
847
- import BurhModals from '@/pages/burh/modals/modals';
848
- import ShareModal from '~/components/burh-ds/Modals/ShareModal.vue';
849
- import swal from 'sweetalert2';
850
- import Basics from '~/components/burh-ds/Loadings/Basics.vue';
851
-
852
- import { textToFlagClass } from '~/util/common';
853
-
854
- import moment from 'moment';
855
- import 'moment/locale/pt-br';
856
-
857
- import heic2any from 'heic2any';
858
-
859
- export default {
860
- layout: 'BurhUserLayout',
861
- name: 'user-profile',
862
- components: {
863
- ProfileHeader,
864
- Crop,
865
- BurhModals,
866
- ShareModal,
867
- Basics
868
- },
869
- props: ['userProfile'],
870
- watch: {
871
- '$store.state.localStorage.currentUser'() {
872
- if (this.$store.state.localStorage.currentUser == null) {
873
- if (!this.isCurrentUser() && this.user.private) {
874
- this.$router.push('/');
875
- }
876
- }
877
- }
878
- },
879
- data() {
880
- return {
881
- console: console,
882
- modals: {
883
- crop: false,
884
- modal0: false
885
- },
886
- isBig: false,
887
- isActive: false,
888
- isEditing: false,
889
- isMobileOnlyWatch: isMobileOnly,
890
- baseUrl: process.env.baseAppUrl,
891
- fileImageBase64: null,
892
- avatarPercentCompleted: null,
893
- coverPercentCompleted: null,
894
- cropType: 'avatar',
895
- activeModal: '',
896
- userData: null,
897
- index: null,
898
- linkShare: null,
899
- profile_completion: 0,
900
- job: null,
901
- user: this.userProfile,
902
- switches: {
903
- helpProfile: false
904
- },
905
- loading: false
906
- };
907
- },
908
- head() {
909
- if (this.user != null) {
910
-
911
- let meta = [];
912
- if(this.user.complementary_information.about != null && this.user.complementary_information.about.trim() != '') {
913
- meta.push(
914
- {
915
- hid: 'description',
916
- name: 'description',
917
- content: `Conheça ${this.user.name} ${this.user.last_name}. ${this.user.complementary_information.about.substring(0, 140)} `
918
- },
919
- {
920
- hid: 'og:description',
921
- name: 'og:description',
922
- content: `Conheça ${this.user.name} ${this.user.last_name}. ${this.user.complementary_information.about.substring(0, 140)} `
923
- },
924
- {
925
- hid: 'twitter:description',
926
- name: 'twitter:description',
927
- content: `Conheça ${this.user.name} ${this.user.last_name}. ${this.user.complementary_information.about.substring(0, 140)} `
928
- }
929
- );
930
- }
931
-
932
- meta.push(
933
- {
934
- hid: 'og:title',
935
- name: 'og:title',
936
- content: `${this.user.name} ${this.user.last_name} no Burh`
937
- },
938
- {
939
- hid: 'twitter:title',
940
- name: 'twitter:title',
941
- content: `${this.user.name} ${this.user.last_name} no Burh`
942
- },
943
- {
944
- hid: 'og:url',
945
- name: 'og:url',
946
- content: `https://burh.com.br/${this.user.slug}`
947
- }
948
- );
949
-
950
- return {
951
- title: `${this.user.name} ${this.user.last_name} no Burh`,
952
- meta: meta
953
- };
954
- } else {
955
- return {
956
- //title: "Olalala "
957
- };
958
- }
959
- },
960
- methods: {
961
-
962
- async resize(img, type = 'jpeg') {
963
- // let max_width
964
- const MAX_WIDTH = 1280;
965
- const MAX_HEIGHT = 720;
966
- const MAX_SIZE = 100000; // 100kb
967
-
968
- const canvas = document.createElement('canvas');
969
- const ctx = canvas.getContext('2d');
970
-
971
- ctx.drawImage(img, 0, 0);
972
-
973
- let width = img.width;
974
- let height = img.height;
975
- let start = 0;
976
- let end = 1;
977
- let last, accepted, blob;
978
-
979
- // keep portration
980
- if (width > height) {
981
- if (width > MAX_WIDTH) {
982
- height *= MAX_WIDTH / width;
983
- width = MAX_WIDTH;
984
- }
985
- } else {
986
- if (height > MAX_HEIGHT) {
987
- width *= MAX_HEIGHT / height;
988
- height = MAX_HEIGHT;
989
- }
990
- }
991
- canvas.width = width;
992
- canvas.height = height;
993
-
994
- ctx.drawImage(img, 0, 0, width, height);
995
-
996
- accepted = blob = await new Promise(rs => canvas.toBlob(rs, 'image/'+type, 1));
997
-
998
- if (blob.size < MAX_SIZE) {
999
-
1000
- return blob;
1001
- } else {
1002
-
1003
- }
1004
-
1005
- // Binary search for the right size
1006
- while (true) {
1007
- const mid = Math.round( ((start + end) / 2) * 100 ) / 100;
1008
- if (mid === last) break;
1009
- last = mid;
1010
- blob = await new Promise(rs => canvas.toBlob(rs, 'image/'+type, mid));
1011
-
1012
- if (blob.size > MAX_SIZE) { end = mid; }
1013
- if (blob.size < MAX_SIZE) { start = mid; accepted = blob; }
1014
- }
1015
-
1016
- return accepted;
1017
- },
1018
- b64toBlob (b64Data, contentType='', sliceSize=512) {
1019
-
1020
- // var byteString = atob(b64Data.split(',')[1]);
1021
- const byteCharacters = atob(b64Data.split(',')[1]);
1022
- const byteArrays = [];
1023
-
1024
- for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) {
1025
- const slice = byteCharacters.slice(offset, offset + sliceSize);
1026
-
1027
- const byteNumbers = new Array(slice.length);
1028
- for (let i = 0; i < slice.length; i++) {
1029
- byteNumbers[i] = slice.charCodeAt(i);
1030
- }
1031
-
1032
- const byteArray = new Uint8Array(byteNumbers);
1033
- byteArrays.push(byteArray);
1034
- }
1035
-
1036
- const blob = new Blob(byteArrays, { type: contentType });
1037
- return blob;
1038
- },
1039
- sortUserCourse(){
1040
- return this.procedureSortInformation(this.user.course);
1041
- },
1042
-
1043
- sortUserExperience(){
1044
- return this.procedureSortInformation(this.user.experience);
1045
- },
1046
-
1047
- sortUserEducation() {
1048
- return this.procedureSortInformation(this.user.education);
1049
- },
1050
-
1051
- procedureSortInformation(value){
1052
- if(value == null || value == '' || value == undefined){
1053
- return;
1054
- }
1055
-
1056
- let arrRetuned = [];
1057
-
1058
- let isHappening = value.filter(e => e.current == 1);
1059
- let isFinished = value.filter(e => e.current == 0);
1060
-
1061
- let auxElement, auxIndex;
1062
- isHappening.forEach((element, index, arr) => {
1063
-
1064
- for(let i = index; i < arr.length; i++){
1065
- if (index == i ) {
1066
- auxElement = arr[i];
1067
- auxIndex = i;
1068
- }else {
1069
- if (arr[i].start_year >= auxElement.start_year) { // more than or equal
1070
- if (arr[i].start_year > auxElement.start_year) { // only more than
1071
- auxElement = arr[i];
1072
- auxIndex = i;
1073
- } else if (arr[i].start_month >= auxElement.start_month) { // if equal compare months
1074
- auxElement = arr[i];
1075
- auxIndex = i;
1076
- }
1077
- }
1078
- }
1079
- }
1080
-
1081
- arr[auxIndex] = element;
1082
- arrRetuned.push(auxElement);
1083
- // arr[index] = auxElement;
1084
-
1085
- });
1086
-
1087
- isFinished.forEach((element, index, arr) => {
1088
-
1089
- for(let i = index; i < arr.length; i++){
1090
- if (index == i ) {
1091
- auxElement = arr[i];
1092
- auxIndex = i;
1093
- }else {
1094
- if (arr[i].end_year >= auxElement.end_year) { // more than or equal
1095
- if (arr[i].end_year > auxElement.end_year) { // only more than
1096
- auxElement = arr[i];
1097
- auxIndex = i;
1098
- } else if (arr[i].end_month >= auxElement.end_month) { // if equal compare months
1099
- auxElement = arr[i];
1100
- auxIndex = i;
1101
- }
1102
- }
1103
- }
1104
- }
1105
-
1106
- arr[auxIndex] = element;
1107
- arrRetuned.push(auxElement);
1108
- // arr[index] = auxElement;
1109
-
1110
- });
1111
-
1112
- return arrRetuned;
1113
-
1114
- },
1115
- async removeUserImage(type){
1116
-
1117
- let obj = {
1118
- title: type == 'avatar' ? 'perfil' : 'capa',
1119
- description: type == 'avatar' ? 'sua foto de perfil.' : 'sua imagem de capa'
1120
- };
1121
-
1122
- swal
1123
- .fire({
1124
- title: `<span class="text-danger">Remover Imagem de ${obj.title}</span>`,
1125
- html: `Você tem certeza que deseja excluir ${obj.description}`,
1126
- buttonsStyling: false,
1127
- confirmButtonClass: ' btn btn-danger btn-fill',
1128
- confirmButtonText: 'Sim, Remover',
1129
- showCancelButton: true,
1130
- cancelButtonText: 'Cancelar',
1131
- cancelButtonClass: 'btn btn-outline-default btn-fill',
1132
- reverseButtons: true
1133
- })
1134
- .then(async result => {
1135
- if (result.value) {
1136
- let url;
1137
-
1138
- if(type == 'avatar'){
1139
- url = process.env.routes.api.user.removeUserAvatar;
1140
- this.user.avatar = null;
1141
- }
1142
-
1143
- if(type == 'banner'){
1144
- url = process.env.routes.api.user.removeUserBanner;
1145
- this.user.cover = null;
1146
- }
1147
-
1148
- await this.$axios.delete(url, {
1149
- headers: {
1150
- Authorization: `Bearer ${this.$store.state.localStorage.token}`
1151
- }
1152
- });
1153
-
1154
- this.updateUserInfo();
1155
- }
1156
- });
1157
- },
1158
-
1159
- async applyToJob() {
1160
-
1161
- if(this.$store.state.localStorage.currentUser.profile_completion >= 60) {
1162
- if (this.job.handicapped == true && this.$store.state.localStorage.currentUser.deficiency.id == 0) {
1163
- swal.fire({
1164
- title: 'Vaga exclusiva para PCD',
1165
- html: 'Essa é uma oportunidade exclusiva para pcd, para se candidatar é necessario informar uma deficiência.',
1166
- buttonsStyling: false,
1167
- confirmButtonClass: ' btn btn-primary btn-fill',
1168
- showCancelButton: true,
1169
- confirmButtonText: 'Editar perfil',
1170
- cancelButtonText: 'Cancelar',
1171
- cancelButtonClass: 'btn btn-outline-default btn-fill',
1172
- reverseButtons: true
1173
- });
1174
- } else {
1175
- let obj = {
1176
- data:{
1177
- job_id: this.job.job_id,
1178
- user_id: this.$store.state.localStorage.currentUser.user_id
1179
- }
1180
- };
1181
-
1182
- let { data } = await this.$axios.post(process.env.routes.api.user.applyToJob, obj, {
1183
- headers: {
1184
- Authorization: `Bearer ${this.$store.state.localStorage.token}`
1185
- }
1186
- });
1187
-
1188
- swal.fire({
1189
- title: `${!this.job.applied ? 'Inscrição realizada com sucesso' : 'Você saiu dessa vaga'}`,
1190
- buttonsStyling: false,
1191
- confirmButtonClass: 'btn btn-primary btn-fill'
1192
- });
1193
-
1194
- this.job.applied = !this.job.applied;
1195
- let href = window.location.href;
1196
- let newHREF = href.replace(window.location.search, '');
1197
- window.history.replaceState({}, document.title, newHREF);
1198
- let id = this.job.job_id;
1199
- this.job = null;
1200
- this.$router.push('/vagas/' + id);
1201
- }
1202
- }
1203
- },
1204
- fromNow(date, format = 'YYYY-MM-DD HH:mm:ss') {
1205
- return date != null ? moment(date, format).locale('pt-BR').fromNow() : null;
1206
- },
1207
- textToFlagClass: textToFlagClass,
1208
- async updateUserInfo() {
1209
- let objUser = await this.$getUser(this.$store.state.localStorage.token);
1210
- this.$store.commit('localStorage/setUser', objUser.data.user);
1211
- this.profile_completion = objUser.data.user.profile_completion;
1212
- },
1213
- onShareUserProfile() {
1214
- this.linkShare = process.env.baseAppUrl + '/' + this.$route.params.userSlug;
1215
- this.modals.modal0 = true;
1216
- },
1217
- async onDownloadProfile() {
1218
- let downloadCv = await this.$axios.get(
1219
- process.env.routes.api.user.getProfilePdf
1220
- .replace(':company_id', 22845207)
1221
- .replace(':user_id', this.user.user_id),
1222
- {
1223
- headers: {
1224
- Authorization: `Bearer ${this.$store.state.localStorage.token}`
1225
- },
1226
- responseType: 'blob'
1227
- }
1228
- );
1229
- const url = window.URL.createObjectURL(new Blob([downloadCv.data]));
1230
- const link = document.createElement('a');
1231
- link.href = url;
1232
- link.setAttribute('download', this.user.name + '.pdf'); //or any other extension
1233
- document.body.appendChild(link);
1234
- link.click();
1235
- link.remove();
1236
- window.URL.revokeObjectURL(url);
1237
- },
1238
- setUserLinks(data){
1239
- if (data.linkedin_url != null){
1240
- this.user.complementary_information.linkedin_url = !data.linkedin_url ? null : data.linkedin_url;
1241
- }
1242
-
1243
- if (data.facebook_url != null) {
1244
- this.user.complementary_information.facebook_url = !data.facebook_url ? null : data.facebook_url;
1245
- }
1246
-
1247
- if (data.twitter_url != null){
1248
- this.user.complementary_information.twitter_url = !data.twitter_url ? null : data.twitter_url;
1249
- }
1250
-
1251
- if (data.website != null){
1252
- this.user.complementary_information.website = !data.website ? null : data.website;
1253
- }
1254
-
1255
- },
1256
- setUpdatedOtherInformations(data) {
1257
- if (data.address != null) {
1258
- this.user.address = data.address;
1259
- }
1260
-
1261
- if (data.deficiency != null) {
1262
- this.user.deficiency = data.deficiency;
1263
- }
1264
-
1265
- if (data.desired_job != null) {
1266
- this.user.desired_job = data.desired_job;
1267
- }
1268
-
1269
- if (data.name != null && data.last_name != null) {
1270
- this.user.name = data.name;
1271
- this.user.last_name = data.last_name;
1272
- }
1273
-
1274
- if (data.wage_pretension != null) {
1275
- this.user.complementary_information.wage_pretension =
1276
- data.wage_pretension;
1277
- }
1278
-
1279
- if (data.cellphone != null) {
1280
- if (this.user.contact != null && this.user.contact.length > 0) {
1281
- this.user.contact[0].cellphone = data.cellphone == false ? null : data.cellphone;
1282
- } else {
1283
- this.user.contact = [{ phone: null, cellphone: data.cellphone == false ? null : data.cellphone }];
1284
- }
1285
- }
1286
-
1287
- if (data.phone != null) {
1288
- if (this.user.contact != null && this.user.contact.length > 0) {
1289
- this.user.contact[0].phone = data.phone == false ? null : data.phone;
1290
- } else {
1291
- this.user.contact = [{ phone: data.phone == false ? null : data.phone, cellphone: null }];
1292
- }
1293
- }
1294
-
1295
- if(data.birthday != null) {
1296
- this.user.complementary_information.birth = data.birthday;
1297
- }
1298
-
1299
- if(data.gender != null) {
1300
- this.user.complementary_information.gender = data.gender;
1301
- }
1302
-
1303
- },
1304
- setNewValue: function(object, value) {
1305
- let userEducation = object.filter(obj => {
1306
- return obj.education_id == value.education_id ? obj : null;
1307
- });
1308
-
1309
- this.user.complementary_information.about = $event;
1310
- },
1311
-
1312
- toggleActive: function() {
1313
- this.isActive = !this.isActive;
1314
- },
1315
- toggleEdit: function() {
1316
- this.isEditing = !this.isEditing;
1317
- this.switches.helpProfile = !this.switches.helpProfile;
1318
- },
1319
-
1320
- isCurrentUser() {
1321
- return (
1322
- this.$store.state.localStorage.currentUser != null &&
1323
- this.$store.state.localStorage.currentUser.slug ==
1324
- this.$route.params.userSlug &&
1325
- this.$store.state.localStorage.currentCompany == null
1326
- );
1327
- },
1328
- toBase64: file =>
1329
- new Promise((resolve, reject) => {
1330
-
1331
- const reader = new FileReader();
1332
- reader.readAsDataURL(file);
1333
- reader.onload = () => resolve(reader.result);
1334
- reader.onerror = error => reject(error);
1335
- }),
1336
- async onImageCropped(event) {
1337
- if (this.cropType == 'avatar') {
1338
- await this.saveAvatar(event);
1339
- } else {
1340
- await this.saveCover(event);
1341
- }
1342
- },
1343
- async saveCover(event) {
1344
- this.modals.crop = false;
1345
-
1346
- // Rota para salvar o cover com crop
1347
- let routeCropped = process.env.routes.api.user.saveCover.replace(
1348
- ':userId',
1349
- this.user.user_id
1350
- );
1351
- routeCropped = routeCropped.replace(':size', '2048');
1352
-
1353
- this.coverPercentCompleted = 0;
1354
-
1355
- // Requisização para salvar o cover com crop
1356
- let { data } = await this.$axios.post(routeCropped, event.croppedFile, {
1357
- onUploadProgress: progressEvent => {
1358
- this.coverPercentCompleted =
1359
- Math.floor((progressEvent.loaded * 100) / progressEvent.total) / 2;
1360
- }
1361
- });
1362
-
1363
- // Rota para salvar o cover original
1364
- let routeOriginal = process.env.routes.api.user.saveCover.replace(
1365
- ':userId',
1366
- this.user.user_id
1367
- );
1368
- routeOriginal = routeOriginal.replace(':size', '');
1369
- routeOriginal = routeOriginal + '?name=' + data.data.replace('2048/', '');
1370
-
1371
- // Requisição para salvar o cover original
1372
- await this.$axios.post(routeOriginal, event.originalFile, {
1373
- onUploadProgress: progressEvent => {
1374
- this.coverPercentCompleted +=
1375
- Math.floor((progressEvent.loaded * 100) / progressEvent.total) / 2;
1376
- }
1377
- });
1378
-
1379
- this.coverPercentCompleted = null;
1380
-
1381
- this.user.cover = event.croppedBase64;
1382
- this.updateUserInfo();
1383
- },
1384
- async calculateImageSize(base64String) {
1385
- let padding, inBytes, base64StringLength;
1386
- if(base64String.endsWith('==')) padding = 2;
1387
- else if (base64String.endsWith('=')) padding = 1;
1388
- else padding = 0;
1389
-
1390
- base64StringLength = base64String.length;
1391
- //
1392
- inBytes =(base64StringLength / 4 ) * 3 - padding;
1393
- //
1394
- this.kbytes = inBytes / 1000;
1395
- return this.kbytes;
1396
- },
1397
- async uploadCroppedAvatar(event) {
1398
- let routeCropped = process.env.routes.api.user.saveAvatar.replace(
1399
- ':userId',
1400
- this.user.user_id
1401
- );
1402
- routeCropped = routeCropped.replace(':size', '200');
1403
-
1404
- this.avatarPercentCompleted = 0;
1405
-
1406
- let { data } = await this.$axios.post(routeCropped, event.croppedFile, {
1407
- onUploadProgress: progressEvent => {
1408
- this.avatarPercentCompleted = Math.floor((progressEvent.loaded * 100) / progressEvent.total) / 2;
1409
- }
1410
- });
1411
-
1412
- return data;
1413
- },
1414
- async uploadOriginalAvatar(event, data, blob) {
1415
- let routeOriginal = process.env.routes.api.user.saveAvatar.replace(
1416
- ':userId',
1417
- this.user.user_id
1418
- );
1419
- routeOriginal = routeOriginal.replace(':size', '');
1420
- routeOriginal = routeOriginal + '?name=' + data.data.replace('200/', '');
1421
-
1422
- let formData = new FormData();
1423
- formData.append('blob', blob, data.data.replace('200/', ''));
1424
-
1425
- await this.$axios.post(routeOriginal, formData, {
1426
- onUploadProgress: progressEvent => {
1427
- this.avatarPercentCompleted += Math.floor((progressEvent.loaded * 100) / progressEvent.total) / 2;
1428
- }
1429
- });
1430
- },
1431
- async saveAvatar(event) {
1432
- let resizedImage;
1433
- this.modals.crop = false;
1434
-
1435
- const blob = await this.b64toBlob(event.originalBase64);
1436
-
1437
- const img = new Image();
1438
- img.src = URL.createObjectURL(blob);
1439
-
1440
- img.onload = () => this.resize(img, 'jpeg').then(async blob => {
1441
- resizedImage = blob;
1442
- let data = await this.uploadCroppedAvatar(event);
1443
- await this.uploadOriginalAvatar(event, data, resizedImage);
1444
-
1445
- this.avatarPercentCompleted = null;
1446
-
1447
- this.user.avatar = event.croppedBase64;
1448
- let user = this.$store.state.localStorage.currentUser;
1449
- user.avatar = 'https://burh.s3-sa-east-1.amazonaws.com/' + data.data;
1450
- this.$store.commit('localStorage/setUser', user);
1451
- this.updateUserInfo();
1452
- });
1453
-
1454
- // ATÉ AQUI PARA REDIMENSIONAR A IMAGEM
1455
-
1456
- // Rota para salvar o avatar com crop
1457
- // let routeCropped = process.env.routes.api.user.saveAvatar.replace(
1458
- // ':userId',
1459
- // this.user.user_id
1460
- // );
1461
- // routeCropped = routeCropped.replace(':size', '200');
1462
-
1463
- // this.avatarPercentCompleted = 0;
1464
-
1465
- // // Requisização para salvar o avatar com crop
1466
- // let { data } = await this.$axios.post(routeCropped, event.croppedFile, {
1467
- // onUploadProgress: progressEvent => {
1468
- // this.avatarPercentCompleted = Math.floor((progressEvent.loaded * 100) / progressEvent.total) / 2;
1469
- // }
1470
- // });
1471
-
1472
- // Rota para salvar o avatar original
1473
- // let routeOriginal = process.env.routes.api.user.saveAvatar.replace(
1474
- // ':userId',
1475
- // this.user.user_id
1476
- // );
1477
- // routeOriginal = routeOriginal.replace(':size', '');
1478
- // routeOriginal = routeOriginal + '?name=' + data.data.replace('200/', '');
1479
-
1480
- // let formData = new FormData();
1481
- // formData.append('blob', resizedImage, data.data.replace('200/', ''));
1482
-
1483
- // // Requisição para salvar o avatar original
1484
-
1485
- //
1486
- //
1487
-
1488
- // await this.$axios.post(routeOriginal, event.originalFile, {
1489
- // onUploadProgress: progressEvent => {
1490
- // this.avatarPercentCompleted += Math.floor((progressEvent.loaded * 100) / progressEvent.total) / 2;
1491
- // }
1492
- // });
1493
-
1494
- },
1495
- onAvatarClick() {
1496
- if (!this.isCurrentUser()) {
1497
- return;
1498
- }
1499
- this.cropType = 'avatar';
1500
- this.$refs.inputFile.value = null;
1501
- this.fileImageBase64 = null;
1502
- this.modals.crop = false;
1503
- this.$refs.inputFile.click();
1504
- },
1505
- onCoverClick() {
1506
- if (!this.isCurrentUser()) {
1507
- return;
1508
- }
1509
- this.cropType = 'cover';
1510
- this.$refs.inputFile.value = null;
1511
- this.fileImageBase64 = null;
1512
- this.modals.crop = false;
1513
- this.$refs.inputFile.click();
1514
- },
1515
- async onAvatarChange() {
1516
- let file = this.$refs.inputFile.files[0];
1517
- this.loading = true;
1518
- let blob = new Blob([file], { type: file.type });
1519
- if (file.type == 'image/heic') {
1520
-
1521
- const convertedFile = await heic2any({
1522
- blob: blob,
1523
- type: 'image/jpeg',
1524
- quality: 0.1
1525
- });
1526
- blob = convertedFile;
1527
-
1528
- }
1529
-
1530
- this.fileImageBase64 = await this.toBase64(blob);
1531
- this.loading = false;
1532
- this.modals.crop = true;
1533
- },
1534
- currentJob: function() {
1535
- if (this.user.experience == null) {
1536
- return null;
1537
- }
1538
-
1539
- let filter = this.user.experience.filter(exp => {
1540
- return exp.current == 1;
1541
- });
1542
-
1543
- if (filter.length <= 0) {
1544
- return null;
1545
- } else {
1546
- return filter[0];
1547
- }
1548
- },
1549
-
1550
- formatNumberDate(month, year) {
1551
- if (month == 0 && year == 0) {
1552
- return null;
1553
- }
1554
-
1555
- if (month.toString().length == 1) {
1556
- month = '0' + month;
1557
- }
1558
-
1559
- return month + '/' + year;
1560
- },
1561
-
1562
- languageLevel(level) {
1563
- switch (parseInt(level)) {
1564
- case 1:
1565
- return 'Iniciante';
1566
- case 2:
1567
- return 'Elementar';
1568
- case 3:
1569
- return 'Pré-intermediário';
1570
- case 4:
1571
- return 'Intermediário';
1572
- case 5:
1573
- return 'Intermediário Superior';
1574
- case 6:
1575
- return 'Avançado';
1576
- case 7:
1577
- return 'Fluente';
1578
- default:
1579
- return '';
1580
- }
1581
- },
1582
-
1583
- openModal(modal, data = null, index) {
1584
- this.index = index;
1585
- this.activeModal = modal;
1586
- this.userData = data;
1587
- document.body.classList.add('modal-open');
1588
- document.body.classList.add('no-scroll');
1589
- },
1590
-
1591
- async deleteSkill(skillId, skill, name) {
1592
- swal
1593
- .fire({
1594
- title: '<span class="text-danger">Remover Habilidade</span>',
1595
- html: `Você tem certeza que deseja excluir a habilidade <b class="d-block border-radius bg-lighter mt-4 p-3 big">${name}</b>`,
1596
- buttonsStyling: false,
1597
- confirmButtonClass: ' btn btn-danger btn-fill',
1598
- confirmButtonText: 'Sim, Remover',
1599
- showCancelButton: true,
1600
- cancelButtonText: 'Cancelar',
1601
- cancelButtonClass: 'btn btn-outline-default btn-fill',
1602
- reverseButtons: true
1603
- })
1604
- .then(async result => {
1605
- if (result.value) {
1606
- let response = await this.$axios.delete(
1607
- process.env.routes.api.user.deleteSkill.replace(
1608
- ':skillId',
1609
- skillId
1610
- ),
1611
- {
1612
- headers: {
1613
- 'Content-Type': 'application/json',
1614
- Authorization: `Bearer ${this.$store.state.localStorage.token}`
1615
- },
1616
- httpsAgent: new https.Agent({
1617
- rejectUnauthorized: false
1618
- })
1619
- }
1620
- );
1621
-
1622
- if (response.data.error == false) {
1623
- this.user.skill.splice(skill, 1);
1624
- }
1625
- }
1626
- });
1627
- },
1628
-
1629
- deleteLanguage(index) {
1630
- this.user.language.splice(index, 1);
1631
- this.updateUserInfo();
1632
- },
1633
-
1634
- deleteThisCourse(index) {
1635
- this.user.course.splice(index, 1);
1636
- this.updateUserInfo();
1637
- },
1638
-
1639
- deleteThisEducation(index) {
1640
- this.user.education.splice(index, 1);
1641
- this.updateUserInfo();
1642
- },
1643
- deleteThisExperience(index) {
1644
- this.user.experience.splice(index, 1);
1645
- this.updateUserInfo();
1646
- },
1647
-
1648
- clearActive() {
1649
- this.activeModal = '';
1650
- this.userData = null;
1651
- document.body.classList.remove('no-scroll');
1652
- document.body.classList.remove('modal-open');
1653
- document.getElementsByTagName('html')[0].classList.remove('modal-open');
1654
- },
1655
-
1656
- modalInformationData() {
1657
- let data = {
1658
- name: this.user.name + ' ' + this.user.last_name,
1659
- wage_pretension: this.user.complementary_information.wage_pretension,
1660
- cellphone: this.user.contact != null && this.user.contact.length
1661
- ? this.user.contact[0].cellphone
1662
- : null,
1663
- phone: this.user.contact != null && this.user.contact.length
1664
- ? this.user.contact[0].phone
1665
- : null,
1666
- address: this.user.address,
1667
- deficiency: this.user.deficiency,
1668
- desired_job: this.user.desired_job,
1669
- date_of_birth: this.user.complementary_information.birth,
1670
- gender: this.user.complementary_information.gender
1671
- };
1672
-
1673
- return data;
1674
- },
1675
- modalLinksData() {
1676
- let data = {
1677
- linkedin: this.user.complementary_information.linkedin_url,
1678
- facebook: this.user.complementary_information.facebook_url,
1679
- twitter: this.user.complementary_information.twitter_url,
1680
- website: this.user.complementary_information.website,
1681
- };
1682
-
1683
- return data;
1684
- },
1685
- },
1686
- mounted() {
1687
-
1688
- if (this.isCurrentUser()) {
1689
- this.profile_completion = this.$store.state.localStorage.currentUser.profile_completion;
1690
- }
1691
- if (!this.isCurrentUser() && this.user.private) {
1692
- return this.$router.push('/');
1693
- }
1694
-
1695
- if(this.$route.query.job_id != null && this.isCurrentUser()) {
1696
- this.job = this.$route.query;
1697
- }
1698
-
1699
- },
1700
- computed: {
1701
- isUserHasPhoneNumber() {
1702
- if (this.$store.state.localStorage.currentUser == null || this.$store.state.localStorage.currentUser.contact == null) {
1703
- return;
1704
- }
1705
-
1706
- if (this.$store.state.localStorage.currentUser.contact.cellphone != null) {
1707
- return true;
1708
- }
1709
-
1710
- return false;
1711
- },
1712
-
1713
- isUserHasAddress() {
1714
- if (this.$store.state.localStorage.currentUser == null) {
1715
- return;
1716
- }
1717
-
1718
- if (this.$store.state.localStorage.currentUser.profile_pendencies != null && this.$store.state.localStorage.currentUser.profile_pendencies.includes('Endereço')) {
1719
- return false;
1720
- }
1721
-
1722
- return true;
1723
- },
1724
-
1725
- loaded() {
1726
- return (
1727
- this.$store.state.localStorage.currentUser != undefined ||
1728
- this.$store.state.localStorage.currentUser == null
1729
- );
1730
- },
1731
- applyingToJob() {
1732
- return (
1733
- this.$route.query.job_id != null &&
1734
- this.$route.query.company_name != null &&
1735
- this.$route.query.job_title != null &&
1736
- this.$route.query.created_at != null &&
1737
- this.$route.query.city_name != null
1738
- );
1739
- }
1740
- }
1741
- };
1742
- </script>
1743
- <style lang="scss">
1744
- @import "~bootstrap/scss/functions.scss";
1745
- @import "~bootstrap/scss/mixins.scss";
1746
- @import "assets/sass/burh-ds/variables.scss";
1747
- @import "assets/sass/burh-ds/variables/_colors.scss";
1748
-
1749
- #profilePageContent {
1750
- min-height: 100vh;
1751
- padding-top: calc(#{$avatar-size} * 2.5) !important;
1752
-
1753
- @media (min-width: map-get($grid-breakpoints, "md")) {
1754
- padding-top: calc(#{$avatar-size-md} * .8) !important;
1755
- }
1756
- @media (min-width: map-get($grid-breakpoints, "lg")) {
1757
- padding-top: calc(#{$avatar-size-lg} * .8) !important;
1758
- }
1759
- @media (min-width: map-get($grid-breakpoints, "xl")) {
1760
- padding-top: calc(#{$avatar-size-xl} * .8) !important;
1761
- }
1762
- }
1763
- .badge-private {
1764
- font-size: 10px !important;
1765
- }
1766
- .flag-icon {
1767
- width: 48px !important;
1768
- height: 48px !important;
1769
- border-radius: 50% !important;
1770
- }
1771
- // TODO: Remover da página de profile e por em uma de ícone
1772
- .flag-icon-esperanto {
1773
- background-image: url("/img/icons/flags/esperanto.svg");
1774
- }
1775
- .subheader__avatar {
1776
- .avatar-percentage {
1777
- position: absolute;
1778
- left: 50%;
1779
- top: 50%;
1780
- transform: translate(-50%, -50%);
1781
- z-index: 999;
1782
- }
1783
- }
1784
- .jobs-history {
1785
- .profile-bar .avatar {
1786
- position: relative;
1787
- }
1788
- }
1789
-
1790
- .cover-percentage {
1791
- position: absolute;
1792
- z-index: 999;
1793
- left: 50%;
1794
- top: 50%;
1795
- transform: translate(-50%, -50%);
1796
- color: #fff;
1797
- text-shadow: 1px 1px black;
1798
- }
1799
- .card {
1800
- &--animate {
1801
- position: relative;
1802
- top: 0;
1803
- width: 100%;
1804
- height: auto;
1805
- opacity: 1;
1806
- transform: scale(1);
1807
- transition: all 0.35s ease-in-out;
1808
-
1809
- &.closed {
1810
- top: -50vh;
1811
- height: 0;
1812
- opacity: 0;
1813
- transform: scale(0);
1814
- transition: all 0.35s ease-in-out;
1815
- margin: 0 !important;
1816
- }
1817
- }
1818
- }
1819
- .helper-fran {
1820
- &,
1821
- &.add-fixed {
1822
- right: 4vw;
1823
- width: 92vw;
1824
-
1825
- @include media-breakpoint-up(md) {
1826
- width: 350px;
1827
- right: 6vw;
1828
- }
1829
- [class^="text"] {
1830
- margin-right: 0;
1831
- //float: right;
1832
- }
1833
- .helper-fran {
1834
- &__caller {
1835
- display: flex;
1836
- align-items: center;
1837
- justify-content: space-between;
1838
- box-shadow: 0 2px 4px #C4C4C4;
1839
- background-color: $base-light;
1840
- border-radius: 10rem;
1841
- padding: .5rem;
1842
- //color: $base-light;
1843
-
1844
- min-width: 92vw;
1845
-
1846
- @include media-breakpoint-up(md) {
1847
- min-width: 350px;
1848
- }
1849
-
1850
- .fran-avatar {
1851
- width: calc(45px + .5rem);
1852
-
1853
- @include media-breakpoint-up(md) {
1854
- width: calc(55px + .5rem);
1855
- flex: 0 0 calc(55px + .5rem);
1856
- }
1857
- }
1858
- .btn {
1859
- width: 45px;
1860
- height: 45px;
1861
-
1862
- @include media-breakpoint-up(md) {
1863
- width: 55px;
1864
- height: 55px;
1865
- }
1866
- }
1867
-
1868
- &__text {
1869
- flex: 1;
1870
- text-align: left;
1871
- font-size: .8rem;
1872
- padding: 1em;
1873
- }
1874
- }
1875
- &__header {
1876
- display: flex;
1877
- flex: calc(75px + .5rem) 1 0;
1878
- align-items: center;
1879
- justify-content: space-between;
1880
- width: 100%;
1881
- background-color: $primary;
1882
- border-radius: .4375rem .4375rem 0 0;
1883
-
1884
- .fran-avatar {
1885
- margin-right: .5em;
1886
- }
1887
-
1888
- &,
1889
- &.h4 {
1890
- color: $base-light !important;
1891
- font-size: .7rem !important;
1892
- }
1893
- }
1894
- }
1895
- .dropdown-menu {
1896
- margin-top: 0;
1897
- padding-top: 0;
1898
- }
1899
- }
1900
- &.show {
1901
- .helper-fran {
1902
- &__caller {
1903
- box-shadow: 0 0 0 transparent;
1904
- background-color: transparent;
1905
- color: transparent;
1906
-
1907
- .fran-avatar {
1908
- opacity: 0;
1909
- }
1910
- }
1911
- }
1912
- }
1913
- }
1914
- .fran-avatar {
1915
- display: inline-block;
1916
- width: 75px;
1917
-
1918
- img {
1919
- width: 100%;
1920
- height: auto;
1921
- }
1922
-
1923
- &--mini {
1924
- width: 55px;
1925
- }
1926
- }
1927
- .dropdown-item {
1928
- &__icon {
1929
- display: inline-block;
1930
- width: 30px;
1931
- text-align: center;
1932
-
1933
- &:last-child {
1934
- float: right;
1935
- }
1936
- }
1937
- }
1938
- </style>
1
+ <template>
2
+ <div v-show="loaded && (isCurrentUser() || !isCurrentUser() && !user.private)">
3
+ <basics :isLoading="loading" v-if="loading"/>
4
+ <client-only>
5
+ <profile-header type="primary" :image="user.cover" :class="{'profile-edit': isCurrentUser()}">
6
+ <template slot="cover-percentage">
7
+ <h1
8
+ class="cover-percentage"
9
+ v-if="coverPercentCompleted != null"
10
+ >{{coverPercentCompleted}}%</h1>
11
+ </template>
12
+ <template v-if="isCurrentUser() && coverPercentCompleted == null" slot="cover-percentage">
13
+ <span
14
+ :class="{'profile-edit__icon--edit': isEditing}"
15
+ class="profile-edit__icon">
16
+ <span class="profile-edit__text mr-md-4" title="Editar imagem de capa" v-on:click.prevent="onCoverClick();">
17
+ <font-awesome-icon :icon="['fas', 'pen']" size="lg" /> Mudar imagem de capa
18
+ </span>
19
+ <span v-if="user.cover" class="profile-edit__text" title="Excluir imagem de capa" v-on:click.prevent="removeUserImage('banner');">
20
+ <font-awesome-icon :icon="['fas', 'trash']" size="lg" /> Excluir imagem de capa
21
+ </span>
22
+ </span>
23
+ </template>
24
+ <div class="subheader__user col-12 col-md-8">
25
+ <div class="subheader__avatar avatar rounded-circle">
26
+ <img
27
+ :src="user.avatar"
28
+ :alt="user.name + ' ' + user.last_name"
29
+ v-if="user.avatar != null && user.avatar != ''"
30
+ />
31
+ <span
32
+ class="bigger"
33
+ v-if="user.avatar == null || user.avatar == ''"
34
+ >{{user.name.charAt(0)}}{{user.last_name.split(' ')[0].charAt(0)}}</span>
35
+ <h1
36
+ class="avatar-percentage"
37
+ v-if="avatarPercentCompleted != null"
38
+ >{{avatarPercentCompleted}}%</h1>
39
+
40
+ <span
41
+ :class="{'profile-edit__icon--edit': isEditing}"
42
+ class="profile-edit__icon"
43
+ v-if="isCurrentUser()"
44
+ >
45
+ <input
46
+ ref="inputFile"
47
+ type="file"
48
+ @change="onAvatarChange($event)"
49
+ class="profile-edit__caller"
50
+ />
51
+ <span v-on:click.prevent="onAvatarClick()" class="d-block mr-4 avatar-svg" title="Editar Avatar">
52
+ <i class="fas fa-pen fa-lg"></i>
53
+ <!-- <font-awesome-icon :icon="['fas', 'globe']" size="lg" v-on:click.self="onAvatarClick()" /> -->
54
+ </span>
55
+ <span v-if="user.avatar" v-on:click.prevent="removeUserImage('avatar')" class="d-block avatar-svg" title="Excluir Avatar">
56
+ <i class="fas fa-trash fa-lg"></i>
57
+ <!-- <font-awesome-icon :icon="['fas', 'trash']" size="lg" /> -->
58
+ </span>
59
+ </span>
60
+
61
+ <div
62
+ class="profile-pcd rounded-circle"
63
+ v-if="$store.state.localStorage.currentCompany != null && !isCurrentUser() && user.deficiency != null"
64
+ >
65
+ <font-awesome-icon :icon="['fas', 'wheelchair']" />
66
+ </div>
67
+ </div>
68
+ <div class="subheader__info">
69
+ <h1 class="h1">
70
+ {{user.name}} {{user.last_name}}
71
+ <span
72
+ class="badge badge-info badge-sm small badge-private"
73
+ v-if="user.private"
74
+ >Privado</span>
75
+ <button
76
+ v-if="isCurrentUser()"
77
+ class="btn btn-link pl-1 pr-1 my-0 py-0"
78
+ style="min-width: 40px"
79
+ @click="openModal('information', modalInformationData())"
80
+ >
81
+ <font-awesome-icon :icon="['fas', 'pen']" />
82
+ </button>
83
+ </h1>
84
+
85
+ <template v-if="currentJob() != null">
86
+ <p class="ellipsis">{{currentJob().job_title}}</p>
87
+ <p class="small">
88
+ <span>no</span>
89
+ {{currentJob().company}} em
90
+ <b>{{currentJob().location}}</b>
91
+ </p>
92
+ </template>
93
+ </div>
94
+ </div>
95
+ <div class="col-12 col-md-4 subheader__actions" id="subheader">
96
+ <template v-if="isCurrentUser()">
97
+ <base-dropdown
98
+ :menuOnRight="true"
99
+ direction="up"
100
+ titleTag="Adicionar Nova Seção"
101
+ class="add-fixed helper-fran"
102
+ v-on:change="isActive = $event"
103
+ >
104
+ <div class="helper-fran__caller" slot="title-container">
105
+ <span class="fran-avatar fran-avatar--mini">
106
+ <img src="/img/content/fran/fran-00.svg" alt="Fran">
107
+ </span>
108
+ <div class="helper-fran__caller__text">
109
+ Sou a Fran, posso te ajudar a adicionar itens ao seu perfil
110
+ </div>
111
+ <base-button
112
+ type="primary"
113
+ class="btn-rounded mt-0 mr-0 px-3 py-3"
114
+ :class="{'active': isActive}"
115
+ @click="toggleActive()"
116
+ >
117
+ <font-awesome-icon :icon="['fas', 'plus']" aria-label="Adicionar Nova Seção" />
118
+ </base-button>
119
+ </div>
120
+ <li>
121
+ <h4 class="h4 helper-fran__header">
122
+ <span class="fran-avatar">
123
+ <img src="/img/content/fran/fran-00.svg" alt="Fran">
124
+ </span>
125
+ Escolha a área que deseja adicionar ao seu perfil.
126
+ </h4>
127
+ </li>
128
+ <li>
129
+ <a :class="{'text-danger': !(user.complementary_information.about != null && user.complementary_information.about.length)}" class="dropdown-item" href="javascript:void(0);" @click="openModal('about', user.complementary_information.about)">
130
+ <span class="dropdown-item__icon">
131
+ <font-awesome-icon :icon="['fas', 'user']" />
132
+ </span>
133
+ Sobre
134
+ <span class="dropdown-item__icon">
135
+ <font-awesome-icon v-if="user.complementary_information.about != null && user.complementary_information.about.length" :icon="['fas', 'check']" class="text-success"></font-awesome-icon>
136
+ <font-awesome-icon v-else :icon="['fas', 'times']" class="text-danger"></font-awesome-icon>
137
+ </span>
138
+ </a>
139
+ </li>
140
+ <li>
141
+ <a :class="{'text-danger': user.experience != [] && user.experience.length == 0}" class="dropdown-item" href="javascript:void(0);" @click="openModal('experience')">
142
+ <span class="dropdown-item__icon">
143
+ <font-awesome-icon :icon="['fas', 'suitcase']" />
144
+ </span>
145
+ Experiência Profissional
146
+ <span class="dropdown-item__icon">
147
+ <font-awesome-icon v-if="user.experience != [] && user.experience.length != 0" :icon="['fas', 'check']" class="text-success"></font-awesome-icon>
148
+ <font-awesome-icon v-else :icon="['fas', 'times']" class="text-danger"></font-awesome-icon>
149
+ </span>
150
+ </a>
151
+ </li>
152
+ <li>
153
+ <a :class="{'text-danger': user.education != [] && user.education.length == 0}" class="dropdown-item" href="javascript:void(0);" @click="openModal('education')">
154
+ <span class="dropdown-item__icon">
155
+ <font-awesome-icon :icon="['fas', 'user-graduate']" />
156
+ </span>
157
+ Educação
158
+ <span class="dropdown-item__icon">
159
+ <font-awesome-icon v-if="user.education != [] && user.education.length != 0" :icon="['fas', 'check']" class="text-success"></font-awesome-icon>
160
+ <font-awesome-icon v-else :icon="['fas', 'times']" class="text-danger"></font-awesome-icon>
161
+ </span>
162
+ </a>
163
+ </li>
164
+ <li>
165
+ <a :class="{'text-danger': user.course != [] && user.course.length == 0}" class="dropdown-item" href="javascript:void(0);" @click="openModal('courses')">
166
+ <span class="dropdown-item__icon">
167
+ <font-awesome-icon :icon="['fas', 'university']" />
168
+ </span>
169
+ Cursos Profissionalizantes
170
+ <span class="dropdown-item__icon">
171
+ <font-awesome-icon v-if="user.course != [] && user.course.length != 0" :icon="['fas', 'check']" class="text-success"></font-awesome-icon>
172
+ <font-awesome-icon v-else :icon="['fas', 'times']" class="text-danger"></font-awesome-icon>
173
+ </span>
174
+ </a>
175
+ </li>
176
+ <li>
177
+ <a :class="{'text-danger': user.skill != [] && user.skill.length == 0}" class="dropdown-item" href="javascript:void(0);" @click="openModal('skills')">
178
+ <span class="dropdown-item__icon">
179
+ <font-awesome-icon :icon="['fas', 'award']" />
180
+ </span>
181
+ Habilidades
182
+ <span class="dropdown-item__icon">
183
+ <font-awesome-icon v-if="user.skill != [] && user.skill.length != 0" :icon="['fas', 'check']" class="text-success"></font-awesome-icon>
184
+ <font-awesome-icon v-else :icon="['fas', 'times']" class="text-danger"></font-awesome-icon>
185
+ </span>
186
+ </a>
187
+ </li>
188
+ <li>
189
+ <a :class="{'text-danger': user.language != [] && user.language.length == 0}" class="dropdown-item" href="javascript:void(0);" @click="openModal('languages')">
190
+ <span class="dropdown-item__icon">
191
+ <font-awesome-icon :icon="['fas', 'globe']" />
192
+ </span>
193
+ Idiomas
194
+ <span class="dropdown-item__icon">
195
+ <font-awesome-icon v-if="user.language != [] && user.language.length != 0" :icon="['fas', 'check']" class="text-success"></font-awesome-icon>
196
+ <font-awesome-icon v-else :icon="['fas', 'times']" class="text-danger"></font-awesome-icon>
197
+ </span>
198
+ </a>
199
+ </li>
200
+ <li>
201
+ <a :class="{'text-danger': !isUserHasPhoneNumber || !isUserHasAddress}" class="dropdown-item" href="javascript:void(0);" @click="openModal('information', modalInformationData())">
202
+ <span class="dropdown-item__icon">
203
+ <font-awesome-icon :icon="['fas', 'address-card']" />
204
+ </span>
205
+ Dados Gerais
206
+ <span class="dropdown-item__icon">
207
+ <font-awesome-icon v-if="isUserHasPhoneNumber && isUserHasAddress" :icon="['fas', 'check']" class="text-success"></font-awesome-icon>
208
+ <font-awesome-icon v-else :icon="['fas', 'times']" class="text-danger"></font-awesome-icon>
209
+ </span>
210
+ </a>
211
+ </li>
212
+ </base-dropdown>
213
+ <!-- só mobile -->
214
+ <button
215
+ class="btn btn-outline-primary btn-hide-icon d-block d-sm-none"
216
+ @click="onShareUserProfile()"
217
+ >
218
+ <span class="icon-mobile">
219
+ <font-awesome-icon :icon="['fas', 'link']" />
220
+ </span> Compartilhar
221
+ </button>
222
+ <!-- /só mobile -->
223
+ <!-- <button class="btn btn-outline-primary btn-hide-icon" @click="toggleEdit()"> -->
224
+ <button class="btn btn-sm btn-outline-primary px-4 btn-hide-icon" @click="openModal('information', modalInformationData())">
225
+ <span class="icon-mobile">
226
+ <font-awesome-icon :icon="['fas', 'pen']" />
227
+ </span>
228
+ <font-awesome-icon :icon="['fas', 'pen']" class="d-none d-sm-inline-block mr-2" />
229
+ Dados Pessoais
230
+ </button>
231
+ <!-- <button class="btn btn-outline-primary btn-hide-icon d-none d-sm-block">
232
+ <span class="icon-mobile"><font-awesome-icon :icon="['fas', 'pen']" /></span> Compartilhar
233
+ </button>-->
234
+ <base-dropdown :menuOnRight="true" direction class="d-none d-sm-block">
235
+ <base-button
236
+ slot="title-container"
237
+ type="outline-primary"
238
+ class="mt-0 mr-0 btn-rounded btn-ellipsis"
239
+ >
240
+ <font-awesome-icon :icon="['fas', 'ellipsis-h']" />
241
+ </base-button>
242
+ <button class="dropdown-item" @click="onShareUserProfile()">
243
+ <font-awesome-icon :icon="['fas', 'link']" />Compartilhar
244
+ </button>
245
+ <button class="dropdown-item" @click="onDownloadProfile()">
246
+ <font-awesome-icon :icon="['fas', 'print']" />Imprimir Currículo
247
+ </button>
248
+ </base-dropdown>
249
+ </template>
250
+ <template v-if="!isCurrentUser()">
251
+ <!-- só mobile -->
252
+ <!-- <button class="btn btn-outline-primary btn-hide-icon d-block d-sm-none">
253
+ <span class="icon-mobile"><font-awesome-icon :icon="['fas', 'print']" /></span> Imprimir
254
+ </button>-->
255
+ <!-- /só mobile -->
256
+ <button class="btn btn-outline-primary btn-hide-icon" @click="onShareUserProfile()">
257
+ <span class="icon-mobile">
258
+ <font-awesome-icon :icon="['fas', 'link']" />
259
+ </span> Compartilhar
260
+ </button>
261
+ <!-- <button class="btn btn-outline-primary btn-hide-icon d-none d-sm-block">
262
+ <span class="icon-mobile"><font-awesome-icon :icon="['fas', 'pen']" /></span> Compartilhar
263
+ </button>-->
264
+ <base-dropdown v-if="$store.state.localStorage.currentUser != null" :menuOnRight="true" class="d-none d-sm-block">
265
+ <base-button
266
+ slot="title-container"
267
+ type="outline-primary"
268
+ class="mt-0 mr-0 btn-rounded btn-ellipsis"
269
+ >
270
+ <font-awesome-icon :icon="['fas', 'ellipsis-h']" />
271
+ </base-button>
272
+ <!-- <a class="dropdown-item" href="#"><font-awesome-icon :icon="['fas', 'link']" /> Compartilhar</a> -->
273
+ <button class="dropdown-item" @click="onDownloadProfile()">
274
+ <font-awesome-icon :icon="['fas', 'print']" />Imprimir Currículo
275
+ </button>
276
+ </base-dropdown>
277
+ </template>
278
+ </div>
279
+ </profile-header>
280
+ <div
281
+ id="profilePageContent"
282
+ class="page-content page-content--transparent py-2 py-md-4 container-fluid container-fluid--bu"
283
+ >
284
+ <div class="row">
285
+ <div class="col-12 col-md-7 col-lg-8">
286
+ <div v-if="isCurrentUser()" class="profile-bar mb-5 border p-3">
287
+ <span>
288
+ Força do Perfil:
289
+ <b v-if="profile_completion < 60">Iniciante</b>
290
+ <b v-if="profile_completion >= 60 && profile_completion < 75">Intermediário</b>
291
+ <b v-if="profile_completion >= 75 && profile_completion < 85">Avançado</b>
292
+ <b v-if="profile_completion >= 85 && profile_completion < 90">Incrível</b>
293
+ <b v-if="profile_completion >= 90">Fantástico</b>
294
+ </span>
295
+
296
+ <base-progress
297
+ class="progress-xs mb-5 mt-3"
298
+ :height="20"
299
+ :type="'color-primary'"
300
+ :value="profile_completion"
301
+ :gradient="true"
302
+ ></base-progress>
303
+
304
+ <!-- {{$store.state.localStorage.currentUser.profile_completion}} -->
305
+
306
+ <div class="profile-tips" v-if="$store.state.localStorage.currentUser.profile_completion > 10 && $store.state.localStorage.currentUser.profile_completion < 80">
307
+ <p class="small">Para se candidatar a uma vaga você precisa preencher o seu cadastro até o nível <b>Intermediário</b> . </p>
308
+ <p class="small">Clique e preencha os itens das categorias abaixo:</p>
309
+
310
+ <ul class="list-unstyled small">
311
+ <li class="btn btn-sm btn-link d-block my-2 mx-0 px-2 text-left pointer" @click="openModal('experience')" v-if="user.experience == null || user.experience.length == 0">
312
+ <font-awesome-icon :icon="['fas', 'suitcase']" v-if="user.experience == null || user.experience.length == 0" /> Experiência Profissional
313
+ </li>
314
+ <li class="btn btn-sm btn-link d-block my-2 mx-0 px-2 text-left pointer" @click="openModal('education')" v-if="user.education == null || user.education.length == 0">
315
+ <font-awesome-icon :icon="['fas', 'user-graduate']" /> Educação
316
+ </li>
317
+ <li class="btn btn-sm btn-link d-block my-2 mx-0 px-2 text-left pointer" @click="openModal('courses')" v-if="user.course == null || user.course.length == 0">
318
+ <font-awesome-icon :icon="['fas', 'university']" /> Cursos Profissionalizantes
319
+ </li>
320
+ <li class="btn btn-sm btn-link d-block my-2 mx-0 px-2 text-left pointer" @click="openModal('skills')" v-if="user.skill == null || user.skill.length == 0">
321
+ <font-awesome-icon :icon="['fas', 'award']" /> Habilidades
322
+ </li>
323
+ <li class="btn btn-sm btn-link d-block my-2 mx-0 px-2 text-left pointer" @click="openModal('languages')" v-if="user.language == null || user.language.length == 0">
324
+ <font-awesome-icon :icon="['fas', 'globe']" /> Idiomas
325
+ </li>
326
+ </ul>
327
+ </div>
328
+
329
+ <div class="jobs-history" v-if="job != null">
330
+ <div class="row">
331
+ <div class="col-12 col-lg-6">
332
+ <div class="card card--job cursor-pointer z-0 mb-4 mb-lg-0">
333
+ <div class="card-header">
334
+ <span class="avatar rounded-circle">
335
+ <img
336
+ alt
337
+ :src="job.company_logo"
338
+ onerror="this.src=''"
339
+ />
340
+ </span>
341
+ </div>
342
+ <div class="card-body">
343
+ <span class="card__company">{{job.company_name}}</span>
344
+ <h5 class="card-title">{{job.job_title}}</h5>
345
+ <span class="card__local">
346
+ {{job.city_name}}
347
+ </span>
348
+
349
+ <p class="card__published w-100">{{fromNow(job.created_at)}}</p>
350
+ <button class="btn btn-xs btn-outline-primary" @click.prevent="$router.push('/vagas/' + job.job_id)">Ver detalhes</button>
351
+ </div>
352
+ </div>
353
+ </div>
354
+ <div class="col-12 col-lg-6 d-flex flex-wrap align-items-end text-left">
355
+ <h2 class="h6 w-100 mb-0"><b>Complete seu perfil para a vaga!</b></h2>
356
+ <p class="small">Para se candidatar a uma vaga você precisa preencher o seu cadastro até o nível <b>Intermediário</b> . </p>
357
+ <p class="small">Quanto mais informações no seu perfil, maiores são as chances do selecionador chamá-lo para uma entrevista.</p>
358
+ <button @click.prevent="applyToJob()" class="btn btn-sm my-2" :class="{'btn-outline-disabled': profile_completion < 60, 'btn-primary': profile_completion >= 60}" :disabled="profile_completion < 60">Candidatar-se agora</button>
359
+ </div>
360
+ </div>
361
+ </div>
362
+
363
+ <div class="profile-bar__tip">
364
+ <el-tooltip content="Clique e veja todos os itens que podem ser adicionados em seu perfil." placement="bottom">
365
+ <a href="javascript:void(0);" class="small" @click="toggleEdit()">
366
+ <template v-if="switches.helpProfile">
367
+ <font-awesome-icon :icon="['fas', 'toggle-on']" size="lg" />
368
+ Ocultar
369
+ </template>
370
+ <template v-else>
371
+ <font-awesome-icon :icon="['fas', 'toggle-off']" size="lg" />
372
+ Mostrar
373
+ </template>
374
+
375
+ Ajuda de Preenchimento
376
+ </a>
377
+ </el-tooltip>
378
+ </div>
379
+ </div>
380
+
381
+ <div
382
+ :class="isCurrentUser() && isEditing == false && $store.state.localStorage.currentUser.profile_completion <= 10 ? '' : 'closed'"
383
+ class="card card--animate bg-lighter mt-5"
384
+ >
385
+ <div class="card-body">
386
+ <h3 class="h3">
387
+ Boas vindas
388
+ <b>{{user.name}} {{user.last_name}}</b>!
389
+ </h3>
390
+ <p>Agora que você fez seu cadastro no Burh é necessário preencher seus dados abaixo para participar de processos seletivo.s</p>
391
+ <p>Lembre-se que quanto mais informações você colocar e quanto mais elas forem detalhadas, maiores são suas chances de contratação.</p>
392
+ <p>Portanto, capriche em seu perfil e, para fechar com chave de ouro, adicione uma foto e uma imagem de capa - afinal, isso demonstra sua preocupação com os detalhes.</p>
393
+ <button
394
+ class="btn btn-primary btn-auto"
395
+ @click="toggleEdit()"
396
+ >Preencha agora seu perfil</button>
397
+ </div>
398
+ </div>
399
+
400
+ <div
401
+ class="box-zone"
402
+ :class="{
403
+ 'box-zone--edit': isCurrentUser()
404
+ }"
405
+ v-if="user.complementary_information != null && user.complementary_information.about != null && user.complementary_information.about.trim() != '' || isEditing == true"
406
+ >
407
+ <h2 class="h2">
408
+ Sobre
409
+ <button
410
+ v-if="isCurrentUser()"
411
+ class="btn btn-link"
412
+ @click="openModal('about', user.complementary_information.about)"
413
+ >
414
+ <font-awesome-icon :icon="['fas', 'pen']" />
415
+ </button>
416
+ </h2>
417
+ <div
418
+ class="p-4 bg-lightest"
419
+ v-if="isEditing == true && user.complementary_information.about == null || user.complementary_information.about.trim() == ''"
420
+ >
421
+ <p>Conte-nos um pouco sobre você. Pode ser um texto curtinho, explicando o que você faz ou procura - não precisa ser uma super apresentação. Veja o exemplo:</p>
422
+ <p class="mb-0">
423
+ <i>Eu sou a Fran. Trabalho com atendimento e satisfação do cliente. Gosto muito da área de humanas e sou formada em Comunicação Social. Acredito que meu trabalho pode modificar o mundo e direciono com o lema "não basta trabalhar, é preciso ser agende de mudanças positivas".</i>
424
+ </p>
425
+ <button
426
+ class="btn btn-link btn-sm px-0 w-auto mb-0"
427
+ @click="openModal('about', user.complementary_information.about)"
428
+ >
429
+ <font-awesome-icon :icon="['fas', 'plus']" /> Adicionar descrição
430
+ </button>
431
+ </div>
432
+ <pre class="default-text default-text--pre">{{user.complementary_information.about}}</pre>
433
+ </div>
434
+ <div
435
+ class="box-zone"
436
+ :class="{
437
+ 'box-zone--edit': isCurrentUser()
438
+ }"
439
+ v-if="user.experience != null && user.experience.length > 0 || isEditing == true"
440
+ >
441
+ <h2 class="h2">
442
+ Experiência Profissional
443
+ <button
444
+ v-if="isCurrentUser()"
445
+ class="btn btn-link"
446
+ @click="openModal('experience')"
447
+ >
448
+ <font-awesome-icon :icon="['fas', 'plus']" /> Adicionar
449
+ </button>
450
+ </h2>
451
+ <div class="p-4 bg-lightest" v-if="isEditing == true && user.experience.length == 0">
452
+ <p
453
+ class="mb-0"
454
+ >Adicione as suas experiências de trabalho. Pode ser estágio, trabalhos temporários e até mesmo projetos PJ que você ache relavantes. Esse é o espaço para você falar sobre itens que formaram sua carreira até o momento.</p>
455
+ <button
456
+ class="btn btn-link btn-sm px-0 w-auto mb-0"
457
+ @click="openModal('experience')"
458
+ >
459
+ <font-awesome-icon :icon="['fas', 'plus']" /> Adicionar Experiência
460
+ </button>
461
+ </div>
462
+ <div
463
+ :class="{'box-profile--edit': isCurrentUser()}"
464
+ class="box-profile"
465
+ v-for="(job, index) in sortUserExperience()"
466
+ v-bind:key="index"
467
+ @click="isCurrentUser() ? openModal('experience', job, index) : ''"
468
+ >
469
+ <div class="box-profile__header">
470
+ <h3 class="h3">
471
+ {{job.job_title}}
472
+ <button
473
+ v-if="isCurrentUser()"
474
+ class="btn btn-link"
475
+ >
476
+ <font-awesome-icon :icon="['fas', 'pen']" />
477
+ </button>
478
+ </h3>
479
+ <p>{{job.company}} - {{job.location}}</p>
480
+ <p class="small">
481
+ {{formatNumberDate(job.start_month, job.start_year)}} {{job.end_month != null && job.end_year != null ? ' - '+ formatNumberDate(job.end_month, job.end_year) : '' }}
482
+ <template v-if="job.current == 1">(emprego atual)</template>
483
+ </p>
484
+ </div>
485
+ <div
486
+ class="box-profile__body"
487
+ v-if="job.description != null && job.description != ''"
488
+ >
489
+ <p>{{job.description}}</p>
490
+ </div>
491
+ </div>
492
+ </div>
493
+ <div
494
+ class="box-zone"
495
+ :class="{
496
+ 'box-zone--edit': isCurrentUser()
497
+ }"
498
+ v-if="user.education != null && user.education.length > 0 || isEditing == true"
499
+ >
500
+ <h2 class="h2">
501
+ Educação
502
+ <button
503
+ v-if="isCurrentUser()"
504
+ class="btn btn-link"
505
+ @click="openModal('education')"
506
+ >
507
+ <font-awesome-icon :icon="['fas', 'plus']" /> Adicionar
508
+ </button>
509
+ </h2>
510
+ <div class="p-4 bg-lightest" v-if="isEditing == true && user.education.length == 0">
511
+ <p>Coloque suas formações acadêmicas aqui.</p>
512
+ <p class="mb-0">
513
+ <b>Dica:</b> insira as formações mais altas e coloque cursos superiores adicionais. Deixe cursos extras para o item "Cursos Profissionalizantes".
514
+ </p>
515
+ <button
516
+ class="btn btn-link btn-sm px-0 w-auto mb-0"
517
+ @click="openModal('education')"
518
+ >
519
+ <font-awesome-icon :icon="['fas', 'plus']" /> Adicionar Formação
520
+ </button>
521
+ </div>
522
+ <div
523
+ :class="{'box-profile--edit': isCurrentUser()}"
524
+ class="box-profile"
525
+ v-for="(education, index) in sortUserEducation()"
526
+ v-bind:key="index"
527
+ @click="isCurrentUser() ? openModal('education', education, index) : ''"
528
+ >
529
+ <div class="box-profile__header">
530
+ <h3 class="h3">
531
+ {{education.formation}}
532
+ <button
533
+ v-if="isCurrentUser()"
534
+ class="btn btn-link"
535
+ >
536
+ <font-awesome-icon :icon="['fas', 'pen']" />
537
+ </button>
538
+ </h3>
539
+ <p>{{education.institution}} - {{education.location}}</p>
540
+ <p>
541
+ {{formatNumberDate(education.start_month, education.start_year)}}
542
+ <template
543
+ v-if="education.end_year == null"
544
+ >(estudando)</template>
545
+ <template
546
+ v-if="education.end_year != null"
547
+ >- {{formatNumberDate(education.end_month, education.end_year)}}</template>
548
+ </p>
549
+ </div>
550
+ </div>
551
+ </div>
552
+ <div
553
+ class="box-zone"
554
+ :class="{
555
+ 'box-zone--edit': isCurrentUser()
556
+ }"
557
+ v-if="user.course != null && user.course.length > 0 || isEditing == true"
558
+ >
559
+ <h2 class="h2">
560
+ Cursos e Certificados
561
+ <button
562
+ v-if="isCurrentUser()"
563
+ class="btn btn-link"
564
+ @click="openModal('courses')"
565
+ >
566
+ <font-awesome-icon :icon="['fas', 'plus']" />Adicionar
567
+ </button>
568
+ </h2>
569
+ <div class="p-4 bg-lightest" v-if="isEditing == true && user.course.length == 0">
570
+ <p
571
+ class="mb-0"
572
+ >Coloque outros cursos que você realizou e são extra-curriculares. Coloque aqui formações como "Libras", "Curso Extensivo para Metrologia", etc.</p>
573
+ <button class="btn btn-link btn-sm px-0 w-auto mb-0" @click="openModal('courses')">
574
+ <font-awesome-icon :icon="['fas', 'plus']" /> Adicionar Curso ou Certificado
575
+ </button>
576
+ </div>
577
+ <div
578
+ :class="{'box-profile--edit': isCurrentUser()}"
579
+ class="box-profile"
580
+ v-for="(course, index) in sortUserCourse()"
581
+ v-bind:key="index"
582
+ @click="isCurrentUser() ? openModal('courses', course, index) : ''"
583
+ >
584
+ <div class="box-profile__header">
585
+ <h3 class="h3">
586
+ {{course.name}}
587
+ <button
588
+ v-if="isCurrentUser()"
589
+ class="btn btn-link"
590
+ >
591
+ <font-awesome-icon :icon="['fas', 'pen']" />
592
+ </button>
593
+ </h3>
594
+ <p>{{course.institution}}</p>
595
+ <p>
596
+ <template
597
+ v-if="formatNumberDate(course.start_month, course.start_year) != null"
598
+ >
599
+ {{formatNumberDate(course.start_month, course.start_year)}}
600
+ <template
601
+ v-if="course.period != null && course.period > 0 && course.current == 0"
602
+ >({{course.period}} horas)</template>
603
+ </template>
604
+
605
+ <template
606
+ v-if="formatNumberDate(course.start_month, course.start_year) == null"
607
+ >{{course.period}} horas</template>
608
+
609
+ <template v-if="course.current == 1">(estudando)</template>
610
+ <template
611
+ v-if="course.current == 0 && formatNumberDate(course.end_month, course.end_year) != null && formatNumberDate(course.start_month, course.start_year) != null"
612
+ >até {{formatNumberDate(course.end_month, course.end_year)}}</template>
613
+ </p>
614
+ </div>
615
+ </div>
616
+ </div>
617
+ <div
618
+ class="box-zone"
619
+ :class="{
620
+ 'box-zone--edit': isCurrentUser()
621
+ }"
622
+ v-if="user.skill != null && user.skill.length > 0 || isEditing == true"
623
+ >
624
+ <h2 class="h2">
625
+ Habilidades
626
+ <button
627
+ v-if="isCurrentUser()"
628
+ class="btn btn-link"
629
+ @click="openModal('skills')"
630
+ >
631
+ <font-awesome-icon :icon="['fas', 'plus']" /> Adicionar
632
+ </button>
633
+ </h2>
634
+ <div class="p-4 bg-lightest" v-if="isEditing == true && user.skill.length == 0" @click="openModal('skills')">
635
+ <p
636
+ class="mb-0"
637
+ >Adicione habilidades que você acha relevantes. Podem ser itens relacionados a especificações de cargo, habilidades humanas ou resumos de certificados.</p>
638
+ <button class="btn btn-link btn-sm px-0 w-auto mb-0">
639
+ <font-awesome-icon :icon="['fas', 'plus']" /> Adicionar Habilidades
640
+ </button>
641
+ </div>
642
+ <ul class="list-inline">
643
+ <li
644
+ class="list-inline-item"
645
+ v-for="(skill, index) in user.skill"
646
+ v-bind:key="index"
647
+ >
648
+ <button
649
+ class="tag tag-outline-default"
650
+ :class="{
651
+ 'tag-static': !isCurrentUser()
652
+ }"
653
+ >
654
+ {{skill.name}}
655
+ <font-awesome-icon
656
+ :icon="['fas', 'trash']"
657
+ @click="deleteSkill(skill.skill_id, index, skill.name)"
658
+ />
659
+ </button>
660
+ </li>
661
+ </ul>
662
+ </div>
663
+ <div
664
+ class="box-zone"
665
+ :class="{
666
+ 'box-zone--edit': isCurrentUser()
667
+ }"
668
+ v-if="user.language != null && user.language.length > 0 || isEditing == true"
669
+ >
670
+ <h2 class="h2">
671
+ Idiomas
672
+ <button
673
+ v-if="isCurrentUser()"
674
+ class="btn btn-link"
675
+ @click="openModal('languages')"
676
+ >
677
+ <font-awesome-icon :icon="['fas', 'plus']" /> Adicionar
678
+ </button>
679
+ </h2>
680
+ <div class="p-4 bg-lightest" v-if="isEditing == true && user.language.length == 0">
681
+ <p class="mb-0">
682
+ Insira aqui os idiomas que você tem proeficiência, mas evite colocar seu idioma nativo se você está morando no país.
683
+ <b>Exemplo:</b> Evite colocar
684
+ <em>Português - Fluente</em>.
685
+ </p>
686
+ <button
687
+ class="btn btn-link btn-sm px-0 w-auto mb-0"
688
+ @click="openModal('languages')"
689
+ >
690
+ <font-awesome-icon :icon="['fas', 'plus']" /> Adicionar Curso ou Certificado
691
+ </button>
692
+ </div>
693
+ <div class="row">
694
+ <div
695
+ class="col-12 col-sm-6"
696
+ v-for="(language, index) in user.language"
697
+ v-bind:key="index"
698
+ >
699
+ <div class="box-image mb-4" :class="{'box-image--edit': isCurrentUser()}"
700
+ @click="isCurrentUser() ? openModal('languages', language, index) : '' ">
701
+ <div class="box-image__brand avatar avatar-md rounded-circle">
702
+ <span
703
+ class="flag-icon flag-icon-squared"
704
+ :class="textToFlagClass(language.language)"
705
+ ></span>
706
+ </div>
707
+ <div class="box-image__description">
708
+ <h3 class="h3">
709
+ {{language.language}}
710
+ <button
711
+ v-if="isCurrentUser()"
712
+ class="btn btn-link"
713
+ @click="openModal('languages', language, index)"
714
+ >
715
+ <font-awesome-icon :icon="['fas', 'pen']" />
716
+ </button>
717
+ </h3>
718
+ <p>{{languageLevel(language.level)}}</p>
719
+ </div>
720
+ </div>
721
+ </div>
722
+ </div>
723
+ </div>
724
+ </div>
725
+ <div class="col-12 col-md-4 col-lg-3 offset-md-1 offset-lg-1">
726
+ <div class="box-zone">
727
+ <h2 class="h2">Comunidade</h2>
728
+ <div class="row box-zone__community">
729
+ <div class="col-3 col-lg-6">
730
+ <strong>{{user.social.following}}</strong>
731
+ seguindo
732
+ </div>
733
+ <div class="col-3 col-lg-6">
734
+ <strong>{{user.social.followers}}</strong>
735
+ seguidores
736
+ </div>
737
+ </div>
738
+ </div>
739
+ <div class="box-zone">
740
+ <h2 class="h2">Links
741
+ <button
742
+ v-if="isCurrentUser()"
743
+ class="btn btn-link pl-1 pr-1 my-0 py-0"
744
+ style="min-width: 40px"
745
+ @click="openModal('links', modalLinksData())"
746
+ >
747
+ <font-awesome-icon :icon="['fas', 'pen']" />
748
+ </button>
749
+ </h2>
750
+ <ul class="list-unstyled">
751
+ <li
752
+ class="pb-3"
753
+ v-if="user.complementary_information != null && user.complementary_information.twitter_url != null"
754
+ >
755
+ <a :href="user.complementary_information.twitter_url" target="_blank">
756
+ <i class="fab fa-twitter"></i>
757
+ Twitter
758
+ </a>
759
+ </li>
760
+ <li
761
+ class="pb-3"
762
+ v-if="user.complementary_information != null && user.complementary_information.facebook_url != null"
763
+ >
764
+ <a :href="user.complementary_information.facebook_url" target="_blank">
765
+ <i class="fab fa-facebook"></i> Facebook
766
+ </a>
767
+ </li>
768
+ <li
769
+ class="pb-3"
770
+ v-if="user.complementary_information != null && user.complementary_information.linkedin_url != null"
771
+ >
772
+ <a :href="user.complementary_information.linkedin_url" target="_blank">
773
+ <i class="fab fa-linkedin"></i> Linkedin
774
+ </a>
775
+ </li>
776
+ <li
777
+ class="pb-3"
778
+ v-if="user.complementary_information != null && user.complementary_information.website != null"
779
+ >
780
+ <a :href="user.complementary_information.website" target="_blank">
781
+ <i class="fas fa-globe"></i> Website
782
+ </a>
783
+ </li>
784
+ </ul>
785
+ <div class="qr-code">
786
+ <qrcode
787
+ :value="baseUrl + '/' + $route.params.id"
788
+ :options="{ width: 128, height: 128 }"
789
+ class="border"
790
+ ></qrcode>
791
+ <h3 class="h3">Código BURH</h3>
792
+ <p>
793
+ <strong>{{user.user_id}}</strong>
794
+ </p>
795
+ </div>
796
+ </div>
797
+ </div>
798
+ </div>
799
+ </div>
800
+
801
+ <share-modal :show="modals" :url="linkShare" />
802
+
803
+ <burh-modals
804
+ :render="['name', 'about','experience','education','courses','skills','languages','information', 'links', 'address', 'phone']"
805
+ :active="activeModal"
806
+ :data="userData"
807
+ :index="index"
808
+ v-on:modal-close="clearActive($event)"
809
+ v-on:updatedOtherInformations="setUpdatedOtherInformations($event)"
810
+ v-on:updatedLinks="setUserLinks($event)"
811
+ v-on:updateName="user.name = $event"
812
+ v-on:updateLastName="user.last_name = $event"
813
+ v-on:updateAbout="user.complementary_information.about = $event"
814
+ v-on:addExperience="user.experience.unshift($event)"
815
+ v-on:updateExperience="user.experience[$event.index] = $event"
816
+ v-on:deleteExperiences="deleteThisExperience($event.index)"
817
+ v-on:addEducation="user.education.unshift($event)"
818
+ v-on:updateEducation="user.education[$event.index] = $event"
819
+ v-on:deleteEducations="deleteThisEducation($event.index)"
820
+ v-on:addCourses="user.course.unshift($event)"
821
+ v-on:updateCourses="user.course[$event.index] = $event"
822
+ v-on:deleteCourses="deleteThisCourse($event.index)"
823
+ v-on:addSkill="user.skill.unshift($event)"
824
+ v-on:addLanguages="user.language.unshift($event)"
825
+ v-on:updateLanguages="user.language[$event.index] = $event"
826
+ v-on:deleteLanguage="deleteLanguage($event.index)"
827
+ v-on:updateUserInfo="updateUserInfo()"
828
+ ></burh-modals>
829
+
830
+ <crop
831
+ v-if="fileImageBase64 != null"
832
+ :show="modals.crop"
833
+ :type="cropType"
834
+ :file="fileImageBase64"
835
+ v-on:cancel="fileImageBase64 = null; modals.crop = false"
836
+ v-on:image-cropped="onImageCropped($event)"
837
+ ></crop>
838
+ </client-only>
839
+ </div>
840
+ </template>
841
+ <script>
842
+ // import { isMobile, isMobileOnly } from 'mobile-device-detect';
843
+ import { isMobileOnly } from 'mobile-device-detect';
844
+ import ProfileHeader from '~/components/burh-ds/Headings/ProfileHeader.vue';
845
+ import { Crop } from '~/components/burh-ds';
846
+ import https from 'https';
847
+ import BurhModals from '@/pages/burh/modals/modals';
848
+ import ShareModal from '~/components/burh-ds/Modals/ShareModal.vue';
849
+ import swal from 'sweetalert2';
850
+ import Basics from '~/components/burh-ds/Loadings/Basics.vue';
851
+
852
+ import { textToFlagClass } from '~/util/common';
853
+
854
+ import moment from 'moment';
855
+ import 'moment/locale/pt-br';
856
+
857
+ import heic2any from 'heic2any';
858
+
859
+ export default {
860
+ layout: 'BurhUserLayout',
861
+ name: 'user-profile',
862
+ components: {
863
+ ProfileHeader,
864
+ Crop,
865
+ BurhModals,
866
+ ShareModal,
867
+ Basics
868
+ },
869
+ props: ['userProfile'],
870
+ watch: {
871
+ '$store.state.localStorage.currentUser'() {
872
+ if (this.$store.state.localStorage.currentUser == null) {
873
+ if (!this.isCurrentUser() && this.user.private) {
874
+ this.$router.push('/');
875
+ }
876
+ }
877
+ }
878
+ },
879
+ data() {
880
+ return {
881
+ console: console,
882
+ modals: {
883
+ crop: false,
884
+ modal0: false
885
+ },
886
+ isBig: false,
887
+ isActive: false,
888
+ isEditing: false,
889
+ isMobileOnlyWatch: isMobileOnly,
890
+ baseUrl: process.env.baseAppUrl,
891
+ fileImageBase64: null,
892
+ avatarPercentCompleted: null,
893
+ coverPercentCompleted: null,
894
+ cropType: 'avatar',
895
+ activeModal: '',
896
+ userData: null,
897
+ index: null,
898
+ linkShare: null,
899
+ profile_completion: 0,
900
+ job: null,
901
+ user: this.userProfile,
902
+ switches: {
903
+ helpProfile: false
904
+ },
905
+ loading: false
906
+ };
907
+ },
908
+ head() {
909
+ if (this.user != null) {
910
+
911
+ let meta = [];
912
+ if(this.user.complementary_information.about != null && this.user.complementary_information.about.trim() != '') {
913
+ meta.push(
914
+ {
915
+ hid: 'description',
916
+ name: 'description',
917
+ content: `Conheça ${this.user.name} ${this.user.last_name}. ${this.user.complementary_information.about.substring(0, 140)} `
918
+ },
919
+ {
920
+ hid: 'og:description',
921
+ name: 'og:description',
922
+ content: `Conheça ${this.user.name} ${this.user.last_name}. ${this.user.complementary_information.about.substring(0, 140)} `
923
+ },
924
+ {
925
+ hid: 'twitter:description',
926
+ name: 'twitter:description',
927
+ content: `Conheça ${this.user.name} ${this.user.last_name}. ${this.user.complementary_information.about.substring(0, 140)} `
928
+ }
929
+ );
930
+ }
931
+
932
+ meta.push(
933
+ {
934
+ hid: 'og:title',
935
+ name: 'og:title',
936
+ content: `${this.user.name} ${this.user.last_name} no Burh`
937
+ },
938
+ {
939
+ hid: 'twitter:title',
940
+ name: 'twitter:title',
941
+ content: `${this.user.name} ${this.user.last_name} no Burh`
942
+ },
943
+ {
944
+ hid: 'og:url',
945
+ name: 'og:url',
946
+ content: `https://burh.com.br/${this.user.slug}`
947
+ }
948
+ );
949
+
950
+ return {
951
+ title: `${this.user.name} ${this.user.last_name} no Burh`,
952
+ meta: meta
953
+ };
954
+ } else {
955
+ return {
956
+ //title: "Olalala "
957
+ };
958
+ }
959
+ },
960
+ methods: {
961
+
962
+ async resize(img, type = 'jpeg') {
963
+ // let max_width
964
+ const MAX_WIDTH = 1280;
965
+ const MAX_HEIGHT = 720;
966
+ const MAX_SIZE = 100000; // 100kb
967
+
968
+ const canvas = document.createElement('canvas');
969
+ const ctx = canvas.getContext('2d');
970
+
971
+ ctx.drawImage(img, 0, 0);
972
+
973
+ let width = img.width;
974
+ let height = img.height;
975
+ let start = 0;
976
+ let end = 1;
977
+ let last, accepted, blob;
978
+
979
+ // keep portration
980
+ if (width > height) {
981
+ if (width > MAX_WIDTH) {
982
+ height *= MAX_WIDTH / width;
983
+ width = MAX_WIDTH;
984
+ }
985
+ } else {
986
+ if (height > MAX_HEIGHT) {
987
+ width *= MAX_HEIGHT / height;
988
+ height = MAX_HEIGHT;
989
+ }
990
+ }
991
+ canvas.width = width;
992
+ canvas.height = height;
993
+
994
+ ctx.drawImage(img, 0, 0, width, height);
995
+
996
+ accepted = blob = await new Promise(rs => canvas.toBlob(rs, 'image/'+type, 1));
997
+
998
+ if (blob.size < MAX_SIZE) {
999
+
1000
+ return blob;
1001
+ } else {
1002
+
1003
+ }
1004
+
1005
+ // Binary search for the right size
1006
+ while (true) {
1007
+ const mid = Math.round( ((start + end) / 2) * 100 ) / 100;
1008
+ if (mid === last) break;
1009
+ last = mid;
1010
+ blob = await new Promise(rs => canvas.toBlob(rs, 'image/'+type, mid));
1011
+
1012
+ if (blob.size > MAX_SIZE) { end = mid; }
1013
+ if (blob.size < MAX_SIZE) { start = mid; accepted = blob; }
1014
+ }
1015
+
1016
+ return accepted;
1017
+ },
1018
+ b64toBlob (b64Data, contentType='', sliceSize=512) {
1019
+
1020
+ // var byteString = atob(b64Data.split(',')[1]);
1021
+ const byteCharacters = atob(b64Data.split(',')[1]);
1022
+ const byteArrays = [];
1023
+
1024
+ for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) {
1025
+ const slice = byteCharacters.slice(offset, offset + sliceSize);
1026
+
1027
+ const byteNumbers = new Array(slice.length);
1028
+ for (let i = 0; i < slice.length; i++) {
1029
+ byteNumbers[i] = slice.charCodeAt(i);
1030
+ }
1031
+
1032
+ const byteArray = new Uint8Array(byteNumbers);
1033
+ byteArrays.push(byteArray);
1034
+ }
1035
+
1036
+ const blob = new Blob(byteArrays, { type: contentType });
1037
+ return blob;
1038
+ },
1039
+ sortUserCourse(){
1040
+ return this.procedureSortInformation(this.user.course);
1041
+ },
1042
+
1043
+ sortUserExperience(){
1044
+ return this.procedureSortInformation(this.user.experience);
1045
+ },
1046
+
1047
+ sortUserEducation() {
1048
+ return this.procedureSortInformation(this.user.education);
1049
+ },
1050
+
1051
+ procedureSortInformation(value){
1052
+ if(value == null || value == '' || value == undefined){
1053
+ return;
1054
+ }
1055
+
1056
+ let arrRetuned = [];
1057
+
1058
+ let isHappening = value.filter(e => e.current == 1);
1059
+ let isFinished = value.filter(e => e.current == 0);
1060
+
1061
+ let auxElement, auxIndex;
1062
+ isHappening.forEach((element, index, arr) => {
1063
+
1064
+ for(let i = index; i < arr.length; i++){
1065
+ if (index == i ) {
1066
+ auxElement = arr[i];
1067
+ auxIndex = i;
1068
+ }else {
1069
+ if (arr[i].start_year >= auxElement.start_year) { // more than or equal
1070
+ if (arr[i].start_year > auxElement.start_year) { // only more than
1071
+ auxElement = arr[i];
1072
+ auxIndex = i;
1073
+ } else if (arr[i].start_month >= auxElement.start_month) { // if equal compare months
1074
+ auxElement = arr[i];
1075
+ auxIndex = i;
1076
+ }
1077
+ }
1078
+ }
1079
+ }
1080
+
1081
+ arr[auxIndex] = element;
1082
+ arrRetuned.push(auxElement);
1083
+ // arr[index] = auxElement;
1084
+
1085
+ });
1086
+
1087
+ isFinished.forEach((element, index, arr) => {
1088
+
1089
+ for(let i = index; i < arr.length; i++){
1090
+ if (index == i ) {
1091
+ auxElement = arr[i];
1092
+ auxIndex = i;
1093
+ }else {
1094
+ if (arr[i].end_year >= auxElement.end_year) { // more than or equal
1095
+ if (arr[i].end_year > auxElement.end_year) { // only more than
1096
+ auxElement = arr[i];
1097
+ auxIndex = i;
1098
+ } else if (arr[i].end_month >= auxElement.end_month) { // if equal compare months
1099
+ auxElement = arr[i];
1100
+ auxIndex = i;
1101
+ }
1102
+ }
1103
+ }
1104
+ }
1105
+
1106
+ arr[auxIndex] = element;
1107
+ arrRetuned.push(auxElement);
1108
+ // arr[index] = auxElement;
1109
+
1110
+ });
1111
+
1112
+ return arrRetuned;
1113
+
1114
+ },
1115
+ async removeUserImage(type){
1116
+
1117
+ let obj = {
1118
+ title: type == 'avatar' ? 'perfil' : 'capa',
1119
+ description: type == 'avatar' ? 'sua foto de perfil.' : 'sua imagem de capa'
1120
+ };
1121
+
1122
+ swal
1123
+ .fire({
1124
+ title: `<span class="text-danger">Remover Imagem de ${obj.title}</span>`,
1125
+ html: `Você tem certeza que deseja excluir ${obj.description}`,
1126
+ buttonsStyling: false,
1127
+ confirmButtonClass: ' btn btn-danger btn-fill',
1128
+ confirmButtonText: 'Sim, Remover',
1129
+ showCancelButton: true,
1130
+ cancelButtonText: 'Cancelar',
1131
+ cancelButtonClass: 'btn btn-outline-default btn-fill',
1132
+ reverseButtons: true
1133
+ })
1134
+ .then(async result => {
1135
+ if (result.value) {
1136
+ let url;
1137
+
1138
+ if(type == 'avatar'){
1139
+ url = process.env.routes.api.user.removeUserAvatar;
1140
+ this.user.avatar = null;
1141
+ }
1142
+
1143
+ if(type == 'banner'){
1144
+ url = process.env.routes.api.user.removeUserBanner;
1145
+ this.user.cover = null;
1146
+ }
1147
+
1148
+ await this.$axios.delete(url, {
1149
+ headers: {
1150
+ Authorization: `Bearer ${this.$store.state.localStorage.token}`
1151
+ }
1152
+ });
1153
+
1154
+ this.updateUserInfo();
1155
+ }
1156
+ });
1157
+ },
1158
+
1159
+ async applyToJob() {
1160
+
1161
+ if(this.$store.state.localStorage.currentUser.profile_completion >= 60) {
1162
+ if (this.job.handicapped == true && this.$store.state.localStorage.currentUser.deficiency.id == 0) {
1163
+ swal.fire({
1164
+ title: 'Vaga exclusiva para PCD',
1165
+ html: 'Essa é uma oportunidade exclusiva para pcd, para se candidatar é necessario informar uma deficiência.',
1166
+ buttonsStyling: false,
1167
+ confirmButtonClass: ' btn btn-primary btn-fill',
1168
+ showCancelButton: true,
1169
+ confirmButtonText: 'Editar perfil',
1170
+ cancelButtonText: 'Cancelar',
1171
+ cancelButtonClass: 'btn btn-outline-default btn-fill',
1172
+ reverseButtons: true
1173
+ });
1174
+ } else {
1175
+ let obj = {
1176
+ data:{
1177
+ job_id: this.job.job_id,
1178
+ user_id: this.$store.state.localStorage.currentUser.user_id
1179
+ }
1180
+ };
1181
+
1182
+ let { data } = await this.$axios.post(process.env.routes.api.user.applyToJob, obj, {
1183
+ headers: {
1184
+ Authorization: `Bearer ${this.$store.state.localStorage.token}`
1185
+ }
1186
+ });
1187
+
1188
+ swal.fire({
1189
+ title: `${!this.job.applied ? 'Inscrição realizada com sucesso' : 'Você saiu dessa vaga'}`,
1190
+ buttonsStyling: false,
1191
+ confirmButtonClass: 'btn btn-primary btn-fill'
1192
+ });
1193
+
1194
+ this.job.applied = !this.job.applied;
1195
+ let href = window.location.href;
1196
+ let newHREF = href.replace(window.location.search, '');
1197
+ window.history.replaceState({}, document.title, newHREF);
1198
+ let id = this.job.job_id;
1199
+ this.job = null;
1200
+ this.$router.push('/vagas/' + id);
1201
+ }
1202
+ }
1203
+ },
1204
+ fromNow(date, format = 'YYYY-MM-DD HH:mm:ss') {
1205
+ return date != null ? moment(date, format).locale('pt-BR').fromNow() : null;
1206
+ },
1207
+ textToFlagClass: textToFlagClass,
1208
+ async updateUserInfo() {
1209
+ let objUser = await this.$getUser(this.$store.state.localStorage.token);
1210
+ this.$store.commit('localStorage/setUser', objUser.data.user);
1211
+ this.profile_completion = objUser.data.user.profile_completion;
1212
+ },
1213
+ onShareUserProfile() {
1214
+ this.linkShare = process.env.baseAppUrl + '/' + this.$route.params.userSlug;
1215
+ this.modals.modal0 = true;
1216
+ },
1217
+ async onDownloadProfile() {
1218
+ let downloadCv = await this.$axios.get(
1219
+ process.env.routes.api.user.getProfilePdf
1220
+ .replace(':company_id', 22845207)
1221
+ .replace(':user_id', this.user.user_id),
1222
+ {
1223
+ headers: {
1224
+ Authorization: `Bearer ${this.$store.state.localStorage.token}`
1225
+ },
1226
+ responseType: 'blob'
1227
+ }
1228
+ );
1229
+ const url = window.URL.createObjectURL(new Blob([downloadCv.data]));
1230
+ const link = document.createElement('a');
1231
+ link.href = url;
1232
+ link.setAttribute('download', this.user.name + '.pdf'); //or any other extension
1233
+ document.body.appendChild(link);
1234
+ link.click();
1235
+ link.remove();
1236
+ window.URL.revokeObjectURL(url);
1237
+ },
1238
+ setUserLinks(data){
1239
+ if (data.linkedin_url != null){
1240
+ this.user.complementary_information.linkedin_url = !data.linkedin_url ? null : data.linkedin_url;
1241
+ }
1242
+
1243
+ if (data.facebook_url != null) {
1244
+ this.user.complementary_information.facebook_url = !data.facebook_url ? null : data.facebook_url;
1245
+ }
1246
+
1247
+ if (data.twitter_url != null){
1248
+ this.user.complementary_information.twitter_url = !data.twitter_url ? null : data.twitter_url;
1249
+ }
1250
+
1251
+ if (data.website != null){
1252
+ this.user.complementary_information.website = !data.website ? null : data.website;
1253
+ }
1254
+
1255
+ },
1256
+ setUpdatedOtherInformations(data) {
1257
+ if (data.address != null) {
1258
+ this.user.address = data.address;
1259
+ }
1260
+
1261
+ if (data.deficiency != null) {
1262
+ this.user.deficiency = data.deficiency;
1263
+ }
1264
+
1265
+ if (data.desired_job != null) {
1266
+ this.user.desired_job = data.desired_job;
1267
+ }
1268
+
1269
+ if (data.name != null && data.last_name != null) {
1270
+ this.user.name = data.name;
1271
+ this.user.last_name = data.last_name;
1272
+ }
1273
+
1274
+ if (data.wage_pretension != null) {
1275
+ this.user.complementary_information.wage_pretension =
1276
+ data.wage_pretension;
1277
+ }
1278
+
1279
+ if (data.cellphone != null) {
1280
+ if (this.user.contact != null && this.user.contact.length > 0) {
1281
+ this.user.contact[0].cellphone = data.cellphone == false ? null : data.cellphone;
1282
+ } else {
1283
+ this.user.contact = [{ phone: null, cellphone: data.cellphone == false ? null : data.cellphone }];
1284
+ }
1285
+ }
1286
+
1287
+ if (data.phone != null) {
1288
+ if (this.user.contact != null && this.user.contact.length > 0) {
1289
+ this.user.contact[0].phone = data.phone == false ? null : data.phone;
1290
+ } else {
1291
+ this.user.contact = [{ phone: data.phone == false ? null : data.phone, cellphone: null }];
1292
+ }
1293
+ }
1294
+
1295
+ if(data.birthday != null) {
1296
+ this.user.complementary_information.birth = data.birthday;
1297
+ }
1298
+
1299
+ if(data.gender != null) {
1300
+ this.user.complementary_information.gender = data.gender;
1301
+ }
1302
+
1303
+ },
1304
+ setNewValue: function(object, value) {
1305
+ let userEducation = object.filter(obj => {
1306
+ return obj.education_id == value.education_id ? obj : null;
1307
+ });
1308
+
1309
+ this.user.complementary_information.about = $event;
1310
+ },
1311
+
1312
+ toggleActive: function() {
1313
+ this.isActive = !this.isActive;
1314
+ },
1315
+ toggleEdit: function() {
1316
+ this.isEditing = !this.isEditing;
1317
+ this.switches.helpProfile = !this.switches.helpProfile;
1318
+ },
1319
+
1320
+ isCurrentUser() {
1321
+ return (
1322
+ this.$store.state.localStorage.currentUser != null &&
1323
+ this.$store.state.localStorage.currentUser.slug ==
1324
+ this.$route.params.userSlug &&
1325
+ this.$store.state.localStorage.currentCompany == null
1326
+ );
1327
+ },
1328
+ toBase64: file =>
1329
+ new Promise((resolve, reject) => {
1330
+
1331
+ const reader = new FileReader();
1332
+ reader.readAsDataURL(file);
1333
+ reader.onload = () => resolve(reader.result);
1334
+ reader.onerror = error => reject(error);
1335
+ }),
1336
+ async onImageCropped(event) {
1337
+ if (this.cropType == 'avatar') {
1338
+ await this.saveAvatar(event);
1339
+ } else {
1340
+ await this.saveCover(event);
1341
+ }
1342
+ },
1343
+ async saveCover(event) {
1344
+ this.modals.crop = false;
1345
+
1346
+ // Rota para salvar o cover com crop
1347
+ let routeCropped = process.env.routes.api.user.saveCover.replace(
1348
+ ':userId',
1349
+ this.user.user_id
1350
+ );
1351
+ routeCropped = routeCropped.replace(':size', '2048');
1352
+
1353
+ this.coverPercentCompleted = 0;
1354
+
1355
+ // Requisização para salvar o cover com crop
1356
+ let { data } = await this.$axios.post(routeCropped, event.croppedFile, {
1357
+ onUploadProgress: progressEvent => {
1358
+ this.coverPercentCompleted =
1359
+ Math.floor((progressEvent.loaded * 100) / progressEvent.total) / 2;
1360
+ }
1361
+ });
1362
+
1363
+ // Rota para salvar o cover original
1364
+ let routeOriginal = process.env.routes.api.user.saveCover.replace(
1365
+ ':userId',
1366
+ this.user.user_id
1367
+ );
1368
+ routeOriginal = routeOriginal.replace(':size', '');
1369
+ routeOriginal = routeOriginal + '?name=' + data.data.replace('2048/', '');
1370
+
1371
+ // Requisição para salvar o cover original
1372
+ await this.$axios.post(routeOriginal, event.originalFile, {
1373
+ onUploadProgress: progressEvent => {
1374
+ this.coverPercentCompleted +=
1375
+ Math.floor((progressEvent.loaded * 100) / progressEvent.total) / 2;
1376
+ }
1377
+ });
1378
+
1379
+ this.coverPercentCompleted = null;
1380
+
1381
+ this.user.cover = event.croppedBase64;
1382
+ this.updateUserInfo();
1383
+ },
1384
+ async calculateImageSize(base64String) {
1385
+ let padding, inBytes, base64StringLength;
1386
+ if(base64String.endsWith('==')) padding = 2;
1387
+ else if (base64String.endsWith('=')) padding = 1;
1388
+ else padding = 0;
1389
+
1390
+ base64StringLength = base64String.length;
1391
+ //
1392
+ inBytes =(base64StringLength / 4 ) * 3 - padding;
1393
+ //
1394
+ this.kbytes = inBytes / 1000;
1395
+ return this.kbytes;
1396
+ },
1397
+ async uploadCroppedAvatar(event) {
1398
+ let routeCropped = process.env.routes.api.user.saveAvatar.replace(
1399
+ ':userId',
1400
+ this.user.user_id
1401
+ );
1402
+ routeCropped = routeCropped.replace(':size', '200');
1403
+
1404
+ this.avatarPercentCompleted = 0;
1405
+
1406
+ let { data } = await this.$axios.post(routeCropped, event.croppedFile, {
1407
+ onUploadProgress: progressEvent => {
1408
+ this.avatarPercentCompleted = Math.floor((progressEvent.loaded * 100) / progressEvent.total) / 2;
1409
+ }
1410
+ });
1411
+
1412
+ return data;
1413
+ },
1414
+ async uploadOriginalAvatar(event, data, blob) {
1415
+ let routeOriginal = process.env.routes.api.user.saveAvatar.replace(
1416
+ ':userId',
1417
+ this.user.user_id
1418
+ );
1419
+ routeOriginal = routeOriginal.replace(':size', '');
1420
+ routeOriginal = routeOriginal + '?name=' + data.data.replace('200/', '');
1421
+
1422
+ let formData = new FormData();
1423
+ formData.append('blob', blob, data.data.replace('200/', ''));
1424
+
1425
+ await this.$axios.post(routeOriginal, formData, {
1426
+ onUploadProgress: progressEvent => {
1427
+ this.avatarPercentCompleted += Math.floor((progressEvent.loaded * 100) / progressEvent.total) / 2;
1428
+ }
1429
+ });
1430
+ },
1431
+ async saveAvatar(event) {
1432
+ let resizedImage;
1433
+ this.modals.crop = false;
1434
+
1435
+ const blob = await this.b64toBlob(event.originalBase64);
1436
+
1437
+ const img = new Image();
1438
+ img.src = URL.createObjectURL(blob);
1439
+
1440
+ img.onload = () => this.resize(img, 'jpeg').then(async blob => {
1441
+ resizedImage = blob;
1442
+ let data = await this.uploadCroppedAvatar(event);
1443
+ await this.uploadOriginalAvatar(event, data, resizedImage);
1444
+
1445
+ this.avatarPercentCompleted = null;
1446
+
1447
+ this.user.avatar = event.croppedBase64;
1448
+ let user = this.$store.state.localStorage.currentUser;
1449
+ user.avatar = 'https://burh.s3-sa-east-1.amazonaws.com/' + data.data;
1450
+ this.$store.commit('localStorage/setUser', user);
1451
+ this.updateUserInfo();
1452
+ });
1453
+
1454
+ // ATÉ AQUI PARA REDIMENSIONAR A IMAGEM
1455
+
1456
+ // Rota para salvar o avatar com crop
1457
+ // let routeCropped = process.env.routes.api.user.saveAvatar.replace(
1458
+ // ':userId',
1459
+ // this.user.user_id
1460
+ // );
1461
+ // routeCropped = routeCropped.replace(':size', '200');
1462
+
1463
+ // this.avatarPercentCompleted = 0;
1464
+
1465
+ // // Requisização para salvar o avatar com crop
1466
+ // let { data } = await this.$axios.post(routeCropped, event.croppedFile, {
1467
+ // onUploadProgress: progressEvent => {
1468
+ // this.avatarPercentCompleted = Math.floor((progressEvent.loaded * 100) / progressEvent.total) / 2;
1469
+ // }
1470
+ // });
1471
+
1472
+ // Rota para salvar o avatar original
1473
+ // let routeOriginal = process.env.routes.api.user.saveAvatar.replace(
1474
+ // ':userId',
1475
+ // this.user.user_id
1476
+ // );
1477
+ // routeOriginal = routeOriginal.replace(':size', '');
1478
+ // routeOriginal = routeOriginal + '?name=' + data.data.replace('200/', '');
1479
+
1480
+ // let formData = new FormData();
1481
+ // formData.append('blob', resizedImage, data.data.replace('200/', ''));
1482
+
1483
+ // // Requisição para salvar o avatar original
1484
+
1485
+ //
1486
+ //
1487
+
1488
+ // await this.$axios.post(routeOriginal, event.originalFile, {
1489
+ // onUploadProgress: progressEvent => {
1490
+ // this.avatarPercentCompleted += Math.floor((progressEvent.loaded * 100) / progressEvent.total) / 2;
1491
+ // }
1492
+ // });
1493
+
1494
+ },
1495
+ onAvatarClick() {
1496
+ if (!this.isCurrentUser()) {
1497
+ return;
1498
+ }
1499
+ this.cropType = 'avatar';
1500
+ this.$refs.inputFile.value = null;
1501
+ this.fileImageBase64 = null;
1502
+ this.modals.crop = false;
1503
+ this.$refs.inputFile.click();
1504
+ },
1505
+ onCoverClick() {
1506
+ if (!this.isCurrentUser()) {
1507
+ return;
1508
+ }
1509
+ this.cropType = 'cover';
1510
+ this.$refs.inputFile.value = null;
1511
+ this.fileImageBase64 = null;
1512
+ this.modals.crop = false;
1513
+ this.$refs.inputFile.click();
1514
+ },
1515
+ async onAvatarChange() {
1516
+ let file = this.$refs.inputFile.files[0];
1517
+ this.loading = true;
1518
+ let blob = new Blob([file], { type: file.type });
1519
+ if (file.type == 'image/heic') {
1520
+
1521
+ const convertedFile = await heic2any({
1522
+ blob: blob,
1523
+ type: 'image/jpeg',
1524
+ quality: 0.1
1525
+ });
1526
+ blob = convertedFile;
1527
+
1528
+ }
1529
+
1530
+ this.fileImageBase64 = await this.toBase64(blob);
1531
+ this.loading = false;
1532
+ this.modals.crop = true;
1533
+ },
1534
+ currentJob: function() {
1535
+ if (this.user.experience == null) {
1536
+ return null;
1537
+ }
1538
+
1539
+ let filter = this.user.experience.filter(exp => {
1540
+ return exp.current == 1;
1541
+ });
1542
+
1543
+ if (filter.length <= 0) {
1544
+ return null;
1545
+ } else {
1546
+ return filter[0];
1547
+ }
1548
+ },
1549
+
1550
+ formatNumberDate(month, year) {
1551
+ if (month == 0 && year == 0) {
1552
+ return null;
1553
+ }
1554
+
1555
+ if (month.toString().length == 1) {
1556
+ month = '0' + month;
1557
+ }
1558
+
1559
+ return month + '/' + year;
1560
+ },
1561
+
1562
+ languageLevel(level) {
1563
+ switch (parseInt(level)) {
1564
+ case 1:
1565
+ return 'Iniciante';
1566
+ case 2:
1567
+ return 'Elementar';
1568
+ case 3:
1569
+ return 'Pré-intermediário';
1570
+ case 4:
1571
+ return 'Intermediário';
1572
+ case 5:
1573
+ return 'Intermediário Superior';
1574
+ case 6:
1575
+ return 'Avançado';
1576
+ case 7:
1577
+ return 'Fluente';
1578
+ default:
1579
+ return '';
1580
+ }
1581
+ },
1582
+
1583
+ openModal(modal, data = null, index) {
1584
+ this.index = index;
1585
+ this.activeModal = modal;
1586
+ this.userData = data;
1587
+ document.body.classList.add('modal-open');
1588
+ document.body.classList.add('no-scroll');
1589
+ },
1590
+
1591
+ async deleteSkill(skillId, skill, name) {
1592
+ swal
1593
+ .fire({
1594
+ title: '<span class="text-danger">Remover Habilidade</span>',
1595
+ html: `Você tem certeza que deseja excluir a habilidade <b class="d-block border-radius bg-lighter mt-4 p-3 big">${name}</b>`,
1596
+ buttonsStyling: false,
1597
+ confirmButtonClass: ' btn btn-danger btn-fill',
1598
+ confirmButtonText: 'Sim, Remover',
1599
+ showCancelButton: true,
1600
+ cancelButtonText: 'Cancelar',
1601
+ cancelButtonClass: 'btn btn-outline-default btn-fill',
1602
+ reverseButtons: true
1603
+ })
1604
+ .then(async result => {
1605
+ if (result.value) {
1606
+ let response = await this.$axios.delete(
1607
+ process.env.routes.api.user.deleteSkill.replace(
1608
+ ':skillId',
1609
+ skillId
1610
+ ),
1611
+ {
1612
+ headers: {
1613
+ 'Content-Type': 'application/json',
1614
+ Authorization: `Bearer ${this.$store.state.localStorage.token}`
1615
+ },
1616
+ httpsAgent: new https.Agent({
1617
+ rejectUnauthorized: false
1618
+ })
1619
+ }
1620
+ );
1621
+
1622
+ if (response.data.error == false) {
1623
+ this.user.skill.splice(skill, 1);
1624
+ }
1625
+ }
1626
+ });
1627
+ },
1628
+
1629
+ deleteLanguage(index) {
1630
+ this.user.language.splice(index, 1);
1631
+ this.updateUserInfo();
1632
+ },
1633
+
1634
+ deleteThisCourse(index) {
1635
+ this.user.course.splice(index, 1);
1636
+ this.updateUserInfo();
1637
+ },
1638
+
1639
+ deleteThisEducation(index) {
1640
+ this.user.education.splice(index, 1);
1641
+ this.updateUserInfo();
1642
+ },
1643
+ deleteThisExperience(index) {
1644
+ this.user.experience.splice(index, 1);
1645
+ this.updateUserInfo();
1646
+ },
1647
+
1648
+ clearActive() {
1649
+ this.activeModal = '';
1650
+ this.userData = null;
1651
+ document.body.classList.remove('no-scroll');
1652
+ document.body.classList.remove('modal-open');
1653
+ document.getElementsByTagName('html')[0].classList.remove('modal-open');
1654
+ },
1655
+
1656
+ modalInformationData() {
1657
+ let data = {
1658
+ name: this.user.name + ' ' + this.user.last_name,
1659
+ wage_pretension: this.user.complementary_information.wage_pretension,
1660
+ cellphone: this.user.contact != null && this.user.contact.length
1661
+ ? this.user.contact[0].cellphone
1662
+ : null,
1663
+ phone: this.user.contact != null && this.user.contact.length
1664
+ ? this.user.contact[0].phone
1665
+ : null,
1666
+ address: this.user.address,
1667
+ deficiency: this.user.deficiency,
1668
+ desired_job: this.user.desired_job,
1669
+ date_of_birth: this.user.complementary_information.birth,
1670
+ gender: this.user.complementary_information.gender
1671
+ };
1672
+
1673
+ return data;
1674
+ },
1675
+ modalLinksData() {
1676
+ let data = {
1677
+ linkedin: this.user.complementary_information.linkedin_url,
1678
+ facebook: this.user.complementary_information.facebook_url,
1679
+ twitter: this.user.complementary_information.twitter_url,
1680
+ website: this.user.complementary_information.website,
1681
+ };
1682
+
1683
+ return data;
1684
+ },
1685
+ },
1686
+ mounted() {
1687
+
1688
+ if (this.isCurrentUser()) {
1689
+ this.profile_completion = this.$store.state.localStorage.currentUser.profile_completion;
1690
+ }
1691
+ if (!this.isCurrentUser() && this.user.private) {
1692
+ return this.$router.push('/');
1693
+ }
1694
+
1695
+ if(this.$route.query.job_id != null && this.isCurrentUser()) {
1696
+ this.job = this.$route.query;
1697
+ }
1698
+
1699
+ },
1700
+ computed: {
1701
+ isUserHasPhoneNumber() {
1702
+ if (this.$store.state.localStorage.currentUser == null || this.$store.state.localStorage.currentUser.contact == null) {
1703
+ return;
1704
+ }
1705
+
1706
+ if (this.$store.state.localStorage.currentUser.contact.cellphone != null) {
1707
+ return true;
1708
+ }
1709
+
1710
+ return false;
1711
+ },
1712
+
1713
+ isUserHasAddress() {
1714
+ if (this.$store.state.localStorage.currentUser == null) {
1715
+ return;
1716
+ }
1717
+
1718
+ if (this.$store.state.localStorage.currentUser.profile_pendencies != null && this.$store.state.localStorage.currentUser.profile_pendencies.includes('Endereço')) {
1719
+ return false;
1720
+ }
1721
+
1722
+ return true;
1723
+ },
1724
+
1725
+ loaded() {
1726
+ return (
1727
+ this.$store.state.localStorage.currentUser != undefined ||
1728
+ this.$store.state.localStorage.currentUser == null
1729
+ );
1730
+ },
1731
+ applyingToJob() {
1732
+ return (
1733
+ this.$route.query.job_id != null &&
1734
+ this.$route.query.company_name != null &&
1735
+ this.$route.query.job_title != null &&
1736
+ this.$route.query.created_at != null &&
1737
+ this.$route.query.city_name != null
1738
+ );
1739
+ }
1740
+ }
1741
+ };
1742
+ </script>
1743
+ <style lang="scss">
1744
+ @import "~bootstrap/scss/functions.scss";
1745
+ @import "~bootstrap/scss/mixins.scss";
1746
+ @import "assets/sass/burh-ds/variables.scss";
1747
+ @import "assets/sass/burh-ds/variables/_colors.scss";
1748
+
1749
+ #profilePageContent {
1750
+ min-height: 100vh;
1751
+ padding-top: calc(#{$avatar-size} * 2.5) !important;
1752
+
1753
+ @media (min-width: map-get($grid-breakpoints, "md")) {
1754
+ padding-top: calc(#{$avatar-size-md} * .8) !important;
1755
+ }
1756
+ @media (min-width: map-get($grid-breakpoints, "lg")) {
1757
+ padding-top: calc(#{$avatar-size-lg} * .8) !important;
1758
+ }
1759
+ @media (min-width: map-get($grid-breakpoints, "xl")) {
1760
+ padding-top: calc(#{$avatar-size-xl} * .8) !important;
1761
+ }
1762
+ }
1763
+ .badge-private {
1764
+ font-size: 10px !important;
1765
+ }
1766
+ .flag-icon {
1767
+ width: 48px !important;
1768
+ height: 48px !important;
1769
+ border-radius: 50% !important;
1770
+ }
1771
+ // TODO: Remover da página de profile e por em uma de ícone
1772
+ .flag-icon-esperanto {
1773
+ background-image: url("/img/icons/flags/esperanto.svg");
1774
+ }
1775
+ .subheader__avatar {
1776
+ .avatar-percentage {
1777
+ position: absolute;
1778
+ left: 50%;
1779
+ top: 50%;
1780
+ transform: translate(-50%, -50%);
1781
+ z-index: 999;
1782
+ }
1783
+ }
1784
+ .jobs-history {
1785
+ .profile-bar .avatar {
1786
+ position: relative;
1787
+ }
1788
+ }
1789
+
1790
+ .cover-percentage {
1791
+ position: absolute;
1792
+ z-index: 999;
1793
+ left: 50%;
1794
+ top: 50%;
1795
+ transform: translate(-50%, -50%);
1796
+ color: #fff;
1797
+ text-shadow: 1px 1px black;
1798
+ }
1799
+ .card {
1800
+ &--animate {
1801
+ position: relative;
1802
+ top: 0;
1803
+ width: 100%;
1804
+ height: auto;
1805
+ opacity: 1;
1806
+ transform: scale(1);
1807
+ transition: all 0.35s ease-in-out;
1808
+
1809
+ &.closed {
1810
+ top: -50vh;
1811
+ height: 0;
1812
+ opacity: 0;
1813
+ transform: scale(0);
1814
+ transition: all 0.35s ease-in-out;
1815
+ margin: 0 !important;
1816
+ }
1817
+ }
1818
+ }
1819
+ .helper-fran {
1820
+ &,
1821
+ &.add-fixed {
1822
+ right: 4vw;
1823
+ width: 92vw;
1824
+
1825
+ @include media-breakpoint-up(md) {
1826
+ width: 350px;
1827
+ right: 6vw;
1828
+ }
1829
+ [class^="text"] {
1830
+ margin-right: 0;
1831
+ //float: right;
1832
+ }
1833
+ .helper-fran {
1834
+ &__caller {
1835
+ display: flex;
1836
+ align-items: center;
1837
+ justify-content: space-between;
1838
+ box-shadow: 0 2px 4px #C4C4C4;
1839
+ background-color: $base-light;
1840
+ border-radius: 10rem;
1841
+ padding: .5rem;
1842
+ //color: $base-light;
1843
+
1844
+ min-width: 92vw;
1845
+
1846
+ @include media-breakpoint-up(md) {
1847
+ min-width: 350px;
1848
+ }
1849
+
1850
+ .fran-avatar {
1851
+ width: calc(45px + .5rem);
1852
+
1853
+ @include media-breakpoint-up(md) {
1854
+ width: calc(55px + .5rem);
1855
+ flex: 0 0 calc(55px + .5rem);
1856
+ }
1857
+ }
1858
+ .btn {
1859
+ width: 45px;
1860
+ height: 45px;
1861
+
1862
+ @include media-breakpoint-up(md) {
1863
+ width: 55px;
1864
+ height: 55px;
1865
+ }
1866
+ }
1867
+
1868
+ &__text {
1869
+ flex: 1;
1870
+ text-align: left;
1871
+ font-size: .8rem;
1872
+ padding: 1em;
1873
+ }
1874
+ }
1875
+ &__header {
1876
+ display: flex;
1877
+ flex: calc(75px + .5rem) 1 0;
1878
+ align-items: center;
1879
+ justify-content: space-between;
1880
+ width: 100%;
1881
+ background-color: $primary;
1882
+ border-radius: .4375rem .4375rem 0 0;
1883
+
1884
+ .fran-avatar {
1885
+ margin-right: .5em;
1886
+ }
1887
+
1888
+ &,
1889
+ &.h4 {
1890
+ color: $base-light !important;
1891
+ font-size: .7rem !important;
1892
+ }
1893
+ }
1894
+ }
1895
+ .dropdown-menu {
1896
+ margin-top: 0;
1897
+ padding-top: 0;
1898
+ }
1899
+ }
1900
+ &.show {
1901
+ .helper-fran {
1902
+ &__caller {
1903
+ box-shadow: 0 0 0 transparent;
1904
+ background-color: transparent;
1905
+ color: transparent;
1906
+
1907
+ .fran-avatar {
1908
+ opacity: 0;
1909
+ }
1910
+ }
1911
+ }
1912
+ }
1913
+ }
1914
+ .fran-avatar {
1915
+ display: inline-block;
1916
+ width: 75px;
1917
+
1918
+ img {
1919
+ width: 100%;
1920
+ height: auto;
1921
+ }
1922
+
1923
+ &--mini {
1924
+ width: 55px;
1925
+ }
1926
+ }
1927
+ .dropdown-item {
1928
+ &__icon {
1929
+ display: inline-block;
1930
+ width: 30px;
1931
+ text-align: center;
1932
+
1933
+ &:last-child {
1934
+ float: right;
1935
+ }
1936
+ }
1937
+ }
1938
+ </style>