@burh/nuxt-core 1.0.5 → 1.0.7

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