@burh/nuxt-core 1.0.339 → 1.0.341

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 (452) 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/linkedin.svg +14 -14
  22. package/assets/images/icons/notesCv.svg +3 -3
  23. package/assets/images/icons/twitter.svg +14 -14
  24. package/assets/images/icons/whatsapp.svg +14 -14
  25. package/assets/images/linkedinCv.svg +3 -3
  26. package/assets/images/webCv.svg +4 -4
  27. package/assets/sass/argon.scss +104 -104
  28. package/assets/sass/burh-ds/_components.scss +142 -142
  29. package/assets/sass/burh-ds/_functions.scss +29 -29
  30. package/assets/sass/burh-ds/_helpers.scss +18 -18
  31. package/assets/sass/burh-ds/_mixins.scss +17 -17
  32. package/assets/sass/burh-ds/_transitions.scss +12 -12
  33. package/assets/sass/burh-ds/_utilities.scss +31 -31
  34. package/assets/sass/burh-ds/_variables.scss +963 -963
  35. package/assets/sass/burh-ds/_vendors.scss +38 -38
  36. package/assets/sass/burh-ds/atoms/_badge.scss +5 -5
  37. package/assets/sass/burh-ds/atoms/_buttons.scss +222 -222
  38. package/assets/sass/burh-ds/atoms/_forms.scss +416 -416
  39. package/assets/sass/burh-ds/atoms/_tables.scss +31 -31
  40. package/assets/sass/burh-ds/atoms/_type.scss +147 -147
  41. package/assets/sass/burh-ds/mixins/_badge.scss +37 -37
  42. package/assets/sass/burh-ds/mixins/_breakpoints.scss +39 -39
  43. package/assets/sass/burh-ds/mixins/_grid-framework.scss +66 -66
  44. package/assets/sass/burh-ds/mixins/_grid.scss +51 -51
  45. package/assets/sass/burh-ds/molecules/_box.scss +282 -282
  46. package/assets/sass/burh-ds/molecules/_breadcrumb.scss +8 -8
  47. package/assets/sass/burh-ds/molecules/_modal.scss +175 -175
  48. package/assets/sass/burh-ds/molecules/_navbar.scss +262 -262
  49. package/assets/sass/burh-ds/molecules/_notifications.scss +1 -1
  50. package/assets/sass/burh-ds/molecules/_steps-profile.scss +67 -67
  51. package/assets/sass/burh-ds/molecules/_testimonial.scss +53 -53
  52. package/assets/sass/burh-ds/organisms/_banner.scss +51 -51
  53. package/assets/sass/burh-ds/organisms/_cards.scss +228 -228
  54. package/assets/sass/burh-ds/organisms/_carousel.scss +113 -113
  55. package/assets/sass/burh-ds/organisms/_footer.scss +115 -115
  56. package/assets/sass/burh-ds/organisms/_profile-bar.scss +130 -130
  57. package/assets/sass/burh-ds/organisms/_search.scss +17 -17
  58. package/assets/sass/burh-ds/organisms/_subheader.scss +773 -773
  59. package/assets/sass/burh-ds/organisms/_tabs-setting.scss +123 -123
  60. package/assets/sass/burh-ds/organisms/banners/_banner.scss +62 -62
  61. package/assets/sass/burh-ds/organisms/cards/_featured-company.scss +17 -17
  62. package/assets/sass/burh-ds/organisms/cards/_opportunity.scss +16 -16
  63. package/assets/sass/burh-ds/pages/_error.scss +124 -124
  64. package/assets/sass/burh-ds/pages/_jobs.scss +424 -424
  65. package/assets/sass/burh-ds/pages/_testes.scss +350 -350
  66. package/assets/sass/burh-ds/variables/_colors.scss +350 -350
  67. package/assets/sass/burh-ds/variables/_global_settings.scss +39 -39
  68. package/assets/sass/core/alerts/_alert-dismissible.scss +48 -48
  69. package/assets/sass/core/alerts/_alert-notify.scss +47 -47
  70. package/assets/sass/core/alerts/_alert.scss +49 -49
  71. package/assets/sass/core/avatars/_avatar-group.scss +22 -22
  72. package/assets/sass/core/avatars/_avatar.scss +59 -59
  73. package/assets/sass/core/badges/_badge-circle.scss +29 -29
  74. package/assets/sass/core/badges/_badge-dot.scss +42 -42
  75. package/assets/sass/core/badges/_badge-floating.scss +18 -18
  76. package/assets/sass/core/badges/_badge.scss +67 -67
  77. package/assets/sass/core/breadcrumbs/_breadcrumb.scss +42 -42
  78. package/assets/sass/core/buttons/_button-brand.scss +12 -12
  79. package/assets/sass/core/buttons/_button-group.scss +79 -79
  80. package/assets/sass/core/buttons/_button-icon.scss +92 -92
  81. package/assets/sass/core/buttons/_button.scss +90 -90
  82. package/assets/sass/core/cards/_card-animations.scss +10 -10
  83. package/assets/sass/core/cards/_card-blockquote.scss +17 -17
  84. package/assets/sass/core/cards/_card-money.scss +27 -27
  85. package/assets/sass/core/cards/_card-pricing.scss +26 -26
  86. package/assets/sass/core/cards/_card-profile.scss +49 -49
  87. package/assets/sass/core/cards/_card-stats.scss +16 -16
  88. package/assets/sass/core/cards/_card.scss +70 -70
  89. package/assets/sass/core/charts/_chart.scss +69 -69
  90. package/assets/sass/core/close/_close.scss +47 -47
  91. package/assets/sass/core/collapse/_accordion.scss +38 -38
  92. package/assets/sass/core/content/_main-content.scss +17 -17
  93. package/assets/sass/core/custom-forms/_custom-checkbox.scss +47 -47
  94. package/assets/sass/core/custom-forms/_custom-control.scss +58 -58
  95. package/assets/sass/core/custom-forms/_custom-form.scss +45 -45
  96. package/assets/sass/core/custom-forms/_custom-radio.scss +38 -38
  97. package/assets/sass/core/custom-forms/_custom-toggle.scss +122 -122
  98. package/assets/sass/core/dropdowns/_dropdown.scss +89 -89
  99. package/assets/sass/core/footers/_footer.scss +159 -159
  100. package/assets/sass/core/forms/_form-extend.scss +38 -38
  101. package/assets/sass/core/forms/_form-validation.scss +78 -78
  102. package/assets/sass/core/forms/_form.scss +125 -125
  103. package/assets/sass/core/forms/_input-group.scss +136 -136
  104. package/assets/sass/core/grid/_grid.scss +31 -31
  105. package/assets/sass/core/headers/_header.scss +7 -7
  106. package/assets/sass/core/icons/_icon-actions.scss +57 -57
  107. package/assets/sass/core/icons/_icon-shape.scss +48 -48
  108. package/assets/sass/core/icons/_icon.scss +88 -88
  109. package/assets/sass/core/list-groups/_list-check.scss +52 -52
  110. package/assets/sass/core/list-groups/_list-group.scss +46 -46
  111. package/assets/sass/core/maps/_map.scss +10 -10
  112. package/assets/sass/core/masks/_mask.scss +33 -33
  113. package/assets/sass/core/medias/_media-comment.scss +33 -33
  114. package/assets/sass/core/medias/_media.scss +3 -3
  115. package/assets/sass/core/mixins/_alert.scss +22 -22
  116. package/assets/sass/core/mixins/_background-variant.scss +30 -30
  117. package/assets/sass/core/mixins/_badge.scss +12 -12
  118. package/assets/sass/core/mixins/_buttons.scss +105 -105
  119. package/assets/sass/core/mixins/_custom-forms.scss +47 -47
  120. package/assets/sass/core/mixins/_forms.scss +127 -127
  121. package/assets/sass/core/mixins/_icon.scss +10 -10
  122. package/assets/sass/core/mixins/_modals.scss +25 -25
  123. package/assets/sass/core/mixins/_popover.scss +35 -35
  124. package/assets/sass/core/modals/_modal.scss +31 -31
  125. package/assets/sass/core/navbars/_navbar-collapse.scss +37 -37
  126. package/assets/sass/core/navbars/_navbar-dropdown.scss +121 -121
  127. package/assets/sass/core/navbars/_navbar-floating.scss +17 -17
  128. package/assets/sass/core/navbars/_navbar-search.scss +216 -216
  129. package/assets/sass/core/navbars/_navbar-top.scss +58 -58
  130. package/assets/sass/core/navbars/_navbar-vertical.scss +507 -507
  131. package/assets/sass/core/navbars/_navbar.scss +368 -368
  132. package/assets/sass/core/navs/_nav-pills.scss +66 -66
  133. package/assets/sass/core/navs/_nav.scss +33 -33
  134. package/assets/sass/core/paginations/_pagination.scss +49 -49
  135. package/assets/sass/core/popovers/_popover.scss +21 -21
  136. package/assets/sass/core/progresses/_progress.scss +89 -89
  137. package/assets/sass/core/reboot/_reboot.scss +13 -13
  138. package/assets/sass/core/sections/_nucleo-icons.scss +117 -117
  139. package/assets/sass/core/separators/_separator.scss +54 -54
  140. package/assets/sass/core/shortcuts/_shortcut.scss +30 -30
  141. package/assets/sass/core/tables/_table-actions.scss +25 -25
  142. package/assets/sass/core/tables/_table-sortable.scss +28 -28
  143. package/assets/sass/core/tables/_table.scss +153 -153
  144. package/assets/sass/core/timeline/_timeline.scss +182 -182
  145. package/assets/sass/core/type/_article.scss +22 -22
  146. package/assets/sass/core/type/_display.scss +14 -14
  147. package/assets/sass/core/type/_heading.scss +65 -65
  148. package/assets/sass/core/type/_type.scss +27 -27
  149. package/assets/sass/core/utilities/_backgrounds.scss +51 -51
  150. package/assets/sass/core/utilities/_blurable.scss +37 -37
  151. package/assets/sass/core/utilities/_floating.scss +64 -64
  152. package/assets/sass/core/utilities/_helper.scss +18 -18
  153. package/assets/sass/core/utilities/_image.scss +9 -9
  154. package/assets/sass/core/utilities/_opacity.scss +35 -35
  155. package/assets/sass/core/utilities/_overflow.scss +11 -11
  156. package/assets/sass/core/utilities/_position.scss +25 -25
  157. package/assets/sass/core/utilities/_shadows.scss +28 -28
  158. package/assets/sass/core/utilities/_sizing.scss +7 -7
  159. package/assets/sass/core/utilities/_spacing.scss +107 -107
  160. package/assets/sass/core/utilities/_text.scss +49 -49
  161. package/assets/sass/core/utilities/_transform.scss +13 -13
  162. package/assets/sass/core/vendors/_bootstrap-datepicker.scss +279 -279
  163. package/assets/sass/core/vendors/_bootstrap-tagsinput.scss +67 -67
  164. package/assets/sass/core/vendors/_chartjs.scss +22 -22
  165. package/assets/sass/core/vendors/_dropzone.scss +74 -74
  166. package/assets/sass/core/vendors/_element-checkbox.scss +26 -26
  167. package/assets/sass/core/vendors/_element-tables.scss +61 -61
  168. package/assets/sass/core/vendors/_flatpickr.scss +72 -72
  169. package/assets/sass/core/vendors/_fullcalendar.scss +256 -256
  170. package/assets/sass/core/vendors/_headroom.scss +25 -25
  171. package/assets/sass/core/vendors/_lavalamp.scss +157 -157
  172. package/assets/sass/core/vendors/_nouislider.scss +413 -413
  173. package/assets/sass/core/vendors/_quill.scss +280 -280
  174. package/assets/sass/core/vendors/_scrollbar.scss +949 -949
  175. package/assets/sass/core/vendors/_select.scss +70 -70
  176. package/assets/sass/core/vendors/_sweet-alert-2.scss +22 -22
  177. package/assets/sass/core/vendors/_tags.scss +32 -32
  178. package/assets/sass/core/vendors/_vectormap.scss +16 -16
  179. package/assets/sass/custom/_components.scss +142 -142
  180. package/assets/sass/custom/_functions.scss +29 -29
  181. package/assets/sass/custom/_mixins.scss +15 -15
  182. package/assets/sass/custom/_transitions.scss +12 -12
  183. package/assets/sass/custom/_utilities.scss +31 -31
  184. package/assets/sass/custom/_variables.scss +1077 -1077
  185. package/assets/sass/custom/_vendors.scss +38 -38
  186. package/components/argon-core/Badge.vue +56 -56
  187. package/components/argon-core/Banners/Banner.vue +28 -28
  188. package/components/argon-core/Banners/BannerItem.vue +13 -13
  189. package/components/argon-core/BaseAlert.vue +74 -74
  190. package/components/argon-core/BaseButton.vue +81 -81
  191. package/components/argon-core/BaseHeader.vue +21 -21
  192. package/components/argon-core/BasePagination.vue +172 -172
  193. package/components/argon-core/BaseProgress.vue +121 -121
  194. package/components/argon-core/BaseSlider.vue +96 -96
  195. package/components/argon-core/BaseSwitch.vue +46 -46
  196. package/components/argon-core/BaseTable.vue +70 -70
  197. package/components/argon-core/Breadcrumb/Breadcrumb.vue +26 -26
  198. package/components/argon-core/Breadcrumb/BreadcrumbItem.vue +16 -16
  199. package/components/argon-core/Breadcrumb/RouteBreadcrumb.vue +45 -45
  200. package/components/argon-core/ButtonCheckbox.vue +39 -39
  201. package/components/argon-core/ButtonRadioGroup.vue +47 -47
  202. package/components/argon-core/Cards/Card.vue +71 -71
  203. package/components/argon-core/Cards/OpportunityCard.vue +39 -39
  204. package/components/argon-core/Cards/StatsCard.vue +49 -49
  205. package/components/argon-core/Charts/BarChart.js +30 -30
  206. package/components/argon-core/Charts/DoughnutChart.js +30 -30
  207. package/components/argon-core/Charts/LineChart.js +30 -30
  208. package/components/argon-core/Charts/PieChart.js +30 -30
  209. package/components/argon-core/Charts/config.js +491 -491
  210. package/components/argon-core/Charts/globalOptionsMixin.js +7 -7
  211. package/components/argon-core/Charts/optionHelpers.js +10 -10
  212. package/components/argon-core/CloseButton.vue +35 -35
  213. package/components/argon-core/Collapse/Collapse.vue +84 -84
  214. package/components/argon-core/Collapse/CollapseItem.vue +91 -91
  215. package/components/argon-core/Feed/Comment.vue +50 -50
  216. package/components/argon-core/Inputs/BaseCheckbox.vue +79 -79
  217. package/components/argon-core/Inputs/BaseInput.vue +221 -221
  218. package/components/argon-core/Inputs/BaseRadio.vue +68 -68
  219. package/components/argon-core/Inputs/DropzoneFileUpload.vue +127 -127
  220. package/components/argon-core/Inputs/FileInput.vue +54 -54
  221. package/components/argon-core/Inputs/HtmlEditor.vue +105 -105
  222. package/components/argon-core/Inputs/IconCheckbox.vue +45 -45
  223. package/components/argon-core/Inputs/TagsInput.vue +100 -100
  224. package/components/argon-core/Navbar/BaseNav.vue +122 -122
  225. package/components/argon-core/Navbar/NavbarProgress.vue +19 -19
  226. package/components/argon-core/Navbar/NavbarProgressItem.vue +17 -17
  227. package/components/argon-core/Navbar/NavbarToggleButton.vue +21 -21
  228. package/components/argon-core/NavbarToggleButton.vue +29 -29
  229. package/components/argon-core/NotificationPlugin/Notification.vue +207 -207
  230. package/components/argon-core/NotificationPlugin/Notifications.vue +55 -55
  231. package/components/argon-core/NotificationPlugin/index.js +66 -66
  232. package/components/argon-core/SidebarPlugin/SideBar.vue +119 -119
  233. package/components/argon-core/SidebarPlugin/SidebarItem.vue +184 -184
  234. package/components/argon-core/SidebarPlugin/index.js +79 -79
  235. package/components/argon-core/Tabs/Tab.vue +33 -33
  236. package/components/argon-core/Tabs/Tabs.vue +170 -170
  237. package/components/argon-core/Timeline/TimeLine.vue +17 -17
  238. package/components/argon-core/Timeline/TimeLineItem.vue +30 -30
  239. package/components/argon-core/WorldMap/AsyncWorldMap.vue +28 -28
  240. package/components/argon-core/WorldMap/WorldMap.vue +127 -127
  241. package/components/argon-core/index.js +82 -82
  242. package/components/burh-ds/Avatar/AvatarLink.vue +29 -29
  243. package/components/burh-ds/Avatar/BusinessAvatar.vue +38 -38
  244. package/components/burh-ds/Banners/BannerHero.vue +23 -23
  245. package/components/burh-ds/Banners/BannerItem.vue +14 -14
  246. package/components/burh-ds/Button/ExportButton.vue +20 -20
  247. package/components/burh-ds/Button/SwitchStateButton.vue +165 -165
  248. package/components/burh-ds/Capsules/SearchSlug.vue +860 -860
  249. package/components/burh-ds/Capsules/UserProfile.vue +1938 -1938
  250. package/components/burh-ds/Cards/BaseCard.vue +2 -0
  251. package/components/burh-ds/Cards/CampaignCard.vue +40 -40
  252. package/components/burh-ds/Cards/CompanyCard.vue +39 -39
  253. package/components/burh-ds/Cards/CourseInfoCard.vue +72 -72
  254. package/components/burh-ds/Cards/FunctionalityItem.vue +35 -35
  255. package/components/burh-ds/Cards/OpportunityCard.vue +115 -115
  256. package/components/burh-ds/Cards/PerformanceItem.vue +65 -65
  257. package/components/burh-ds/Cards/PlanCard.vue +192 -192
  258. package/components/burh-ds/Cards/ProductCard.vue +142 -142
  259. package/components/burh-ds/Cards/PurchaseCard.vue +58 -58
  260. package/components/burh-ds/Cards/PurchaseCardSimple.vue +58 -58
  261. package/components/burh-ds/Cards/TestCard.vue +189 -189
  262. package/components/burh-ds/Cards/TrainingCard.vue +151 -151
  263. package/components/burh-ds/Cards/WelcomeCard.vue +106 -106
  264. package/components/burh-ds/Carousel/FeedCarousel.vue +47 -47
  265. package/components/burh-ds/Carousel/ImageCarousel.vue +111 -111
  266. package/components/burh-ds/Collapse/DefaultCollapse.vue +70 -70
  267. package/components/burh-ds/Crop/Crop.vue +121 -121
  268. package/components/burh-ds/Curriculum/UserCurriculum/UpgradePlan.vue +74 -74
  269. package/components/burh-ds/Curriculum/UserCurriculum/UserCvLeftSide.vue +509 -509
  270. package/components/burh-ds/Curriculum/UserCurriculum/UserCvMiddle.vue +515 -515
  271. package/components/burh-ds/Curriculum/UserCurriculum/UserCvRightSide.vue +625 -625
  272. package/components/burh-ds/Dropdown/AppLinkArea.vue +132 -132
  273. package/components/burh-ds/Dropdown/DropdownItem.vue +26 -26
  274. package/components/burh-ds/Dropdown/DropdownSection.vue +38 -38
  275. package/components/burh-ds/Dropdown/FaqVideoArea.vue +88 -88
  276. package/components/burh-ds/Dropdown/JobStatusDropdown.vue +8 -1
  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/Filters/BaseFilterContainer.vue +71 -0
  282. package/components/burh-ds/Filters/FilterWithDropdown.vue +86 -28
  283. package/components/burh-ds/Groups/ProductItem.vue +62 -62
  284. package/components/burh-ds/Groups/SimpleProductItem.vue +129 -129
  285. package/components/burh-ds/Headings/AppHeader.vue +214 -213
  286. package/components/burh-ds/Headings/BaseHeader.vue +24 -24
  287. package/components/burh-ds/Headings/Profile.vue +66 -66
  288. package/components/burh-ds/Headings/ProfileHeader.vue +105 -105
  289. package/components/burh-ds/Headings/SettingsHeader.vue +48 -48
  290. package/components/burh-ds/Headings/StepHeader.vue +122 -122
  291. package/components/burh-ds/Input/AutoComplete.vue +136 -136
  292. package/components/burh-ds/Inputs/BaseCheckbox.vue +73 -73
  293. package/components/burh-ds/Inputs/BaseSwitch.vue +43 -43
  294. package/components/burh-ds/Inputs/BaseSwitchSecondary.vue +84 -84
  295. package/components/burh-ds/Inputs/DoubleInputWithIcon.vue +100 -100
  296. package/components/burh-ds/Inputs/HtmlEditor.vue +64 -64
  297. package/components/burh-ds/InterfaceSpa/InterfaceSpa.vue +83 -83
  298. package/components/burh-ds/Jobs/JobDetail.vue +432 -432
  299. package/components/burh-ds/Jobs/JobDetailDesign.vue +151 -151
  300. package/components/burh-ds/Jobs/JobDetailEmpty.vue +27 -27
  301. package/components/burh-ds/Labels/LabelContextIcon.vue +58 -58
  302. package/components/burh-ds/Link/DefaultLink.vue +30 -30
  303. package/components/burh-ds/Lists/ListAvatarCheckbox.vue +157 -157
  304. package/components/burh-ds/Lists/ListNavLinks.vue +54 -54
  305. package/components/burh-ds/Lists/VagasSimple.vue +404 -404
  306. package/components/burh-ds/Loadings/Basics.vue +80 -80
  307. package/components/burh-ds/Loadings/InfiniteLoading.vue +21 -21
  308. package/components/burh-ds/Loadings/LoadingFullPage.vue +68 -68
  309. package/components/burh-ds/Loadings/NewLoading.vue +119 -119
  310. package/components/burh-ds/Loads/LoadingBar.vue +83 -83
  311. package/components/burh-ds/Modals/AddMember.vue +314 -314
  312. package/components/burh-ds/Modals/AddRoleModal.vue +203 -203
  313. package/components/burh-ds/Modals/AppConfigModal.vue +390 -390
  314. package/components/burh-ds/Modals/CourseMessageModal.vue +66 -66
  315. package/components/burh-ds/Modals/DocsModal.vue +111 -111
  316. package/components/burh-ds/Modals/DropzoneModal.vue +123 -123
  317. package/components/burh-ds/Modals/InviteToRole.vue +206 -206
  318. package/components/burh-ds/Modals/MobileModal.vue +65 -65
  319. package/components/burh-ds/Modals/ModalTests.vue +167 -167
  320. package/components/burh-ds/Modals/PlanModal.vue +286 -286
  321. package/components/burh-ds/Modals/RequestModal.vue +281 -281
  322. package/components/burh-ds/Modals/SendCourse.vue +322 -322
  323. package/components/burh-ds/Modals/SendDisc.vue +230 -230
  324. package/components/burh-ds/Modals/SendTest.vue +349 -349
  325. package/components/burh-ds/Modals/ShareModal.vue +228 -228
  326. package/components/burh-ds/Modals/SmsModal.vue +327 -327
  327. package/components/burh-ds/Modals/SubModal.vue +41 -41
  328. package/components/burh-ds/Modals/VideoModal.vue +80 -80
  329. package/components/burh-ds/Modals/WhatsappModal.vue +143 -143
  330. package/components/burh-ds/Navbar/BaseNav.vue +132 -132
  331. package/components/burh-ds/Notifications/Notification.vue +215 -215
  332. package/components/burh-ds/Notifications/Notifications.vue +55 -55
  333. package/components/burh-ds/Notifications/index.js +66 -66
  334. package/components/burh-ds/Pagination/NamedPagination.vue +176 -176
  335. package/components/burh-ds/Questions/Question.vue +183 -183
  336. package/components/burh-ds/Questions/QuestionAttach.vue +13 -13
  337. package/components/burh-ds/Questions/QuestionRadio.vue +122 -122
  338. package/components/burh-ds/Questions/QuestionRadioItem.vue +83 -83
  339. package/components/burh-ds/Questions/QuestionText.vue +66 -66
  340. package/components/burh-ds/Questions/index.js +13 -13
  341. package/components/burh-ds/Skeleton/BaseCardTest.vue +51 -51
  342. package/components/burh-ds/Skeleton/BaseTraining.vue +29 -29
  343. package/components/burh-ds/Skeleton/BufferFolderSkeleton.vue +41 -41
  344. package/components/burh-ds/Skeleton/BufferUserSkeleton.vue +142 -142
  345. package/components/burh-ds/Tabs/Tab.vue +56 -56
  346. package/components/burh-ds/Tabs/Tabs.vue +188 -188
  347. package/components/burh-ds/Tabs/TesteTab.vue +106 -106
  348. package/components/burh-ds/index.js +20 -20
  349. package/components/layouts/argon/Content.vue +17 -17
  350. package/components/layouts/argon/navbar/BlankLayout.vue +61 -61
  351. package/components/layouts/argon/navbar/DashboardNavbar.vue +307 -307
  352. package/components/layouts/burh-ds/ContentFooter.vue +45 -45
  353. package/components/layouts/burh-ds/footer/FooterSimple.vue +20 -20
  354. package/components/layouts/burh-ds/footer/ProductsFooter.vue +330 -330
  355. package/components/layouts/burh-ds/footer/StatusFooter.vue +105 -105
  356. package/components/layouts/burh-ds/footer/StoreFooter.vue +54 -54
  357. package/components/layouts/burh-ds/navbar/AppNavbar.vue +90 -90
  358. package/components/layouts/burh-ds/navbar/BusinessGlobalNavbar.vue +435 -435
  359. package/components/layouts/burh-ds/navbar/CarreirasNavbar.vue +363 -363
  360. package/components/layouts/burh-ds/navbar/CompanyGlobalNavbar.vue +244 -244
  361. package/components/layouts/burh-ds/navbar/EmpresasNavbar.vue +374 -374
  362. package/components/layouts/burh-ds/navbar/EmpresasNavbarLogado.vue +388 -388
  363. package/components/layouts/burh-ds/navbar/GlobalNavbar.vue +535 -535
  364. package/components/layouts/burh-ds/navbar/MobileNavbar.vue +431 -431
  365. package/components/layouts/burh-ds/navbar/PublicNavbar.vue +160 -160
  366. package/components/layouts/burh-ds/navbar/SimpleNavbar.vue +129 -129
  367. package/components/layouts/burh-ds/navbar/UserNavbar.vue +346 -346
  368. package/components/layouts/burh-ds/navbar/UserNavbarLogin.vue +253 -253
  369. package/components/pages/UserProfile/EditProfileForm.vue +142 -142
  370. package/components/pages/UserProfile/UserCard.vue +61 -61
  371. package/components/pages/dashboard/ActivityFeed.vue +102 -102
  372. package/components/pages/dashboard/LightTable.vue +194 -194
  373. package/components/pages/dashboard/PageVisitsTable.vue +107 -107
  374. package/components/pages/dashboard/ProgressTrackList.vue +82 -82
  375. package/components/pages/dashboard/SocialTrafficTable.vue +101 -101
  376. package/components/pages/dashboard/TaskList.vue +56 -56
  377. package/components/pages/dashboard/UserList.vue +72 -72
  378. package/components/pages/forms/BrowserDefaultsValidation.vue +106 -106
  379. package/components/pages/forms/CustomStylesValidation.vue +130 -130
  380. package/components/pages/forms/ServerSideValidation.vue +128 -128
  381. package/components/pages/register/FailedRegistration.vue +29 -29
  382. package/components/pages/register/SuccessfulRegistration.vue +29 -29
  383. package/components/tables/PaginatedTables/clientPaginationMixin.js +86 -86
  384. package/components/tables/RegularTables/CheckboxColoredTable.vue +112 -112
  385. package/components/tables/RegularTables/CheckboxTable.vue +101 -101
  386. package/components/tables/RegularTables/DarkTable.vue +114 -114
  387. package/components/tables/RegularTables/InlineActionsTable.vue +94 -94
  388. package/components/tables/RegularTables/LightTable.vue +117 -117
  389. package/components/tables/RegularTables/StripedTable.vue +94 -94
  390. package/components/tables/RegularTables/TranslucentTable.vue +114 -114
  391. package/components/tables/projects.js +75 -75
  392. package/components/tables/users.js +42 -42
  393. package/components/tables/users2.js +474 -474
  394. package/components/widgets/CalendarWidget.vue +119 -119
  395. package/components/widgets/CreditCard.vue +66 -66
  396. package/components/widgets/MembersCard.vue +99 -99
  397. package/components/widgets/PaypalCard.vue +45 -45
  398. package/components/widgets/ProgressTrackList.vue +76 -76
  399. package/components/widgets/StatsCards.vue +70 -70
  400. package/components/widgets/TaskList.vue +67 -67
  401. package/components/widgets/TimelineCard.vue +66 -66
  402. package/components/widgets/VectorMapCard.vue +139 -139
  403. package/components/widgets/VisaCard.vue +51 -51
  404. package/data/ListVideoLinksMock.json +21 -21
  405. package/dictionary.js +38 -38
  406. package/environment.env.md +34 -34
  407. package/eslint.config.json +12 -12
  408. package/layouts/AuthLayout.vue +191 -191
  409. package/layouts/BurhCarreirasLayout.vue +63 -63
  410. package/layouts/BurhEmpresasLayout.vue +64 -64
  411. package/layouts/BurhNoHeader.vue +63 -63
  412. package/layouts/BurhPublicLayout.vue +67 -67
  413. package/layouts/BurhUserLayout.vue +231 -231
  414. package/layouts/DashboardLayout.vue +226 -226
  415. package/layouts/error.vue +119 -119
  416. package/metadata.json +30 -30
  417. package/middleware/README.md +8 -8
  418. package/middleware/decodeUrl.js +8 -8
  419. package/middleware/maintenance.js +9 -9
  420. package/middleware/new-account.js +6 -6
  421. package/middleware/redirect.js +13 -13
  422. package/middleware/user-agent-error.js +28 -28
  423. package/package.json +113 -113
  424. package/plugins/README.md +7 -7
  425. package/plugins/analytics/ga.js +28 -28
  426. package/plugins/auth/auth.js +210 -210
  427. package/plugins/axios.js +32 -32
  428. package/plugins/carousel/owl-carousel.js +3 -3
  429. package/plugins/crop/crop.js +4 -4
  430. package/plugins/dashboard/dashboard-plugin.js +29 -29
  431. package/plugins/dashboard/directives/click-outside.js +15 -15
  432. package/plugins/dashboard/eventBus.js +1 -1
  433. package/plugins/dashboard/globalComponents.js +41 -41
  434. package/plugins/dashboard/globalDirectives.js +7 -7
  435. package/plugins/dom/loader.js +76 -76
  436. package/plugins/localstorage.js +20 -20
  437. package/plugins/location/location.js +41 -41
  438. package/plugins/pagination/pagination.js +3 -3
  439. package/plugins/qrcode/qrcode.js +4 -4
  440. package/plugins/router.js +8 -8
  441. package/plugins/social-media/fb-sdk.js +44 -44
  442. package/plugins/social-media/share-link-facebook.js +32 -32
  443. package/plugins/social-media/share-link-linkedin.js +30 -30
  444. package/plugins/social-media/share-link-twitter.js +30 -30
  445. package/plugins/social-media/share-link-whatsapp.js +31 -31
  446. package/polyfills.js +96 -96
  447. package/util/common.js +189 -189
  448. package/util/cookie.js +28 -28
  449. package/util/dom.js +63 -63
  450. package/util/getPrefixes.js +12 -12
  451. package/util/request.js +46 -46
  452. 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>