@burh/nuxt-core 1.0.20 → 1.0.21

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