@burh/nuxt-core 1.0.312 → 1.0.313

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