@burh/nuxt-core 1.1.19 → 1.1.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,777 +1,770 @@
1
- <template>
2
- <div class="bg-white content-middle">
3
- <!-- FERRAMENTAS -->
4
- <div class="tools mt-3">
5
- <button
6
- v-for="(tool, index) in tools"
7
- :key="index"
8
- class="ml-3 burh-color"
9
- @click="
10
- isLocked && !unlockedButtons.includes(tool.event)
11
- ? $emit('open-contact')
12
- : tool.event !== 'moveTo' && $emit(tool.event)
13
- "
14
- >
15
- <template v-if="tool.event !== 'moveTo'">
16
- <diamond v-if="isLocked && tool.event !== 'share'" class="mr-1" :size="16" />
17
- {{ tool.name }}
18
- </template>
19
- <template v-else-if="tool.event === 'moveTo'">
20
- <el-dropdown trigger="click" class="dropdown__content">
21
- <span class="title__content icon">
22
- {{tool.name}}
23
- <i class="fas fa-angle-down dropdown__icon"></i>
24
- </span>
25
- <el-dropdown-menu slot="dropdown">
26
- <el-dropdown-item
27
- v-for="(tab, index) in moveToItems"
28
- :key="index"
29
- @click.native="$emit(tool.event, tab)"
30
- >
31
- <i class="fas fa-clipboard-list"></i>
32
- {{ tab.title }}
33
- </el-dropdown-item>
34
- </el-dropdown-menu>
35
- </el-dropdown>
36
- </template>
37
- </button>
38
- </div>
39
- <!-- CV -->
40
- <div class="about content-block mt-5 ml-3 mr-3" v-if="userData.user_curriculum && userData.user_curriculum.annex">
41
- <h5 class="font-weight-bold">
42
- Cadastro Simplificado
43
- <el-tooltip
44
- placement="top"
45
- >
46
- <div style="max-width: 300px" slot="content">
47
- O cadastro simplificado é uma solução criada pela Burh para facilitar a candidatura em vagas sem que seja necessário o preenchimento completo do perfil do candidato, apenas a importação do currículo.
48
- </div>
49
-
50
- <span class="text-primary ml-2">
51
- <i class="fas fa-info-circle"></i>
52
- </span>
53
- </el-tooltip>
54
-
55
- <button
56
- class="cv__box mt-2"
57
- :disabled="isCvDownloading"
58
- @click="() => !isCvDownloading && handleDownloadCv(userData.user_curriculum)"
59
- >
60
- <template v-if="!isCvDownloading">
61
- <span>
62
- <i class="fas fa-download"></i>
63
- </span>
64
-
65
- <span class="font-weight-bold">Baixar Currículo</span>
66
- </template>
67
-
68
- <template v-else>
69
- <span>
70
- <i class="fas fa-spinner spin"></i>
71
- </span>
72
-
73
- <span class="font-weight-bold">Baixando</span>
74
- </template>
75
- </button>
76
- </h5>
77
- </div>
78
- <!-- CV -->
79
- <!-- SOBRE -->
80
- <div class="about content-block mt-5 ml-3 mr-3">
81
- <h5 class="font-weight-bold">Sobre</h5>
82
- <p
83
- v-if="userData && userData.user_complementary_information && userData.user_complementary_information.about || false"
84
- id="USER_ABOUT"
85
- class="mb-0"
86
- :class="
87
- !wordIsLesserThan(
88
- userData.user_complementary_information.about
89
- ) && 'readmore'
90
- "
91
- v-html="
92
- highlightText(
93
- search,
94
- userData.user_complementary_information.about
95
- )
96
- "
97
- ></p>
98
- <a
99
- href="#"
100
- aria-label="expandir conteudo"
101
- v-if="
102
- userData && userData.user_complementary_information && userData.user_complementary_information.about &&
103
- !wordIsLesserThan(
104
- userData.user_complementary_information.about
105
- ) || false
106
- "
107
- @click.prevent.stop="toggleReadMore($event, 'USER_ABOUT')"
108
- >Ler mais</a
109
- >
110
-
111
- <p v-if="!(userData && userData.user_complementary_information && userData.user_complementary_information.about)" class="">
112
- Nenhuma informação adicionada
113
- </p>
114
- </div>
115
- <!-- VÍDEO DE APRESENTAÇÃO -->
116
- <div
117
- v-if="
118
- userData &&
119
- userData.user_complementary_information &&
120
- userData.user_complementary_information.presentation_video"
121
- class="about content-block mt-5 ml-3 mr-3"
122
- >
123
- <h5 class="font-weight-bold">Vídeo de Apresentação</h5>
124
-
125
- <div class="mux__video">
126
- <MuxVideo
127
- :src="userData.user_complementary_information.presentation_video"
128
- />
129
- </div>
130
- </div>
131
-
132
- <!-- DADOS PESSOAIS -->
133
- <div v-if="userData && userData.user_complementary_information">
134
- <h5 class="font-weight-bold mt-4 ml-3">Dados Pessoais</h5>
135
- <div class="ml-3 info-text">
136
- <span v-if="userData.user_complementary_information.rg != null">RG: {{getFormattedValue('rg', userData.user_complementary_information.rg)}}<br></span>
137
- <span v-if="userData.user_complementary_information.cpf != null">CPF: {{getFormattedValue('cpf', userData.user_complementary_information.cpf)}}<br></span>
138
- <span v-if="userData.user_complementary_information.birth != null">Data de Nascimento: {{getFormattedValue('birthDate', userData.user_complementary_information.birth)}}<br></span>
139
- <span v-if="userData.user_complementary_information.mother_name != null">Nome da mãe: {{userData.user_complementary_information.mother_name}}<br></span>
140
- </div>
141
- </div>
142
-
143
- <!-- CONTATO -->
144
- <h5 class="font-weight-bold mt-4 ml-3">Contatos</h5>
145
- <div class="ml-3 info-text">
146
- <span v-if="userData.email != null">Email: {{userData.email}}</span><br>
147
- <span v-if="userData.user_contact && userData.user_contact.cellphone != null && userData.user_contact.cellphone.length > 1 ">Celular: {{getPhoneFormatted(userData.user_contact.cellphone)}}</span><br>
148
- <span v-if="userData.user_contact && userData.user_contact.phone != null && userData.user_contact.phone.length > 1">Telefone: {{getPhoneFormatted(userData.user_contact.phone)}}</span>
149
- </div>
150
-
151
- <!-- EDUCAÇÃO -->
152
- <h5 class="font-weight-bold mt-4 ml-3">Educação</h5>
153
- <div
154
- class=" ml-3"
155
- v-show="userData.user_education.length > 0"
156
- v-for="(edu, index) in userData.user_education"
157
- :key="index"
158
- >
159
- <p
160
- class="sub-title"
161
- v-html="highlightText(search, edu.formation)"
162
- ></p>
163
- <p class="info-text">{{ edu.institution }}</p>
164
- <span class="info-text">
165
- {{ edu.start_month }}/{{ edu.start_year }} -
166
- {{ treatEndDate(edu.end_month, edu.end_year) }}
167
- {{ getTime(false, edu) }}
168
- {{
169
- edu.user_education_period
170
- ? '-' + edu.user_education_period.name
171
- : ''
172
- }} </span
173
- ><br />
174
- <span
175
- class="info-text"
176
- >
177
- {{edu.formation_level_id | formationLevel}}
178
- </span>
179
- </div>
180
-
181
- <!-- EXPERIÊNCIAS -->
182
- <h5 class="font-weight-bold mt-4 ml-3">Experiência</h5>
183
- <div
184
- class="no-info ml-3"
185
- v-show="userData.user_experience.length === 0"
186
- >
187
- <p>
188
- Nenhuma informação adicionada
189
- </p>
190
- </div>
191
- <div
192
- v-show="userData.user_experience.length > 0"
193
- class="experience ml-3 mr-3"
194
- v-for="(exp, index) in userData.user_experience"
195
- :key="`experience-${index}`"
196
- >
197
- <p
198
- class="sub-title"
199
- v-html="highlightText(search, exp.job_title)"
200
- ></p>
201
- <p
202
- class="info-text"
203
- v-html="
204
- highlightText(search, `${exp.company}, ${exp.location}`)
205
- "
206
- ></p>
207
- <span class="info-text">
208
- {{ exp.start_month }}/{{ exp.start_year }} -
209
- {{ treatEndDate(exp.end_month, exp.end_year) }}
210
- {{ getTime(true, exp) }}
211
- </span>
212
-
213
- <p
214
- :id="`USER_EXPERIENCE-${index}`"
215
- class="description mt-4 mb-0"
216
- :class="!wordIsLesserThan(exp.description) && 'readmore'"
217
- v-html="highlightText(search, exp.description)"
218
- ></p>
219
-
220
- <a
221
- href="#"
222
- aria-label="expandir conteudo"
223
- v-show="!wordIsLesserThan(exp.description)"
224
- @click.prevent.stop="
225
- toggleReadMore($event, `USER_EXPERIENCE-${index}`)
226
- "
227
- >Ler mais</a
228
- ><br /><br />
229
- </div>
230
-
231
- <!-- CURSOS -->
232
- <h5 class="font-weight-bold mt-1 ml-3">Cursos Complementares</h5>
233
- <div class="no-info ml-3" v-show="userData.user_course.length === 0">
234
- <p>
235
- Nenhuma informação adicionada
236
- </p>
237
- </div>
238
- <div
239
- v-show="userData.user_course.length > 0"
240
- class="courses ml-3"
241
- v-for="(cou, index) in userData.user_course"
242
- :key="`course-${index}`"
243
- >
244
- <p
245
- class="sub-title"
246
- v-html="highlightText(search, cou.institution)"
247
- ></p>
248
- <p
249
- class="info-text mb-3"
250
- v-html="
251
- highlightText(
252
- search,
253
- `${cou.name} - ${cou.end_year || ''} ${getTime(
254
- false,
255
- cou
256
- )}`
257
- )
258
- "
259
- />
260
- </div>
261
- </div>
262
- </template>
263
-
264
- <script>
265
- import getPrefixes from '~/util/getPrefixes.js';
266
- import { mask } from 'vue-the-mask';
267
- import { Dropdown, DropdownMenu, DropdownItem } from 'element-ui';
268
- import { parsePhoneNumber } from 'awesome-phonenumber';
269
- import MuxVideo from '../../Video/MuxVideo.vue';
270
-
271
- import swal from 'sweetalert2';
272
- import axios from 'axios';
273
-
274
- export default {
275
- name: 'user-cv-middle',
276
- directives: { mask },
277
- props: {
278
- userData: Object,
279
- tools: {
280
- type: Array,
281
- default: () => []
282
- },
283
- search: {
284
- type: String,
285
- default: ''
286
- },
287
- moveToItems: {
288
- type: Array,
289
- default: () => [
290
- {
291
- id: 1,
292
- name: 'applieds',
293
- title: 'Inscritos'
294
- },
295
- {
296
- id: 3,
297
- name: 'selecteds',
298
- title: 'Selecionados'
299
- },
300
- {
301
- id: 5,
302
- name: 'hireds',
303
- title: 'Contratados'
304
- },
305
- {
306
- id: 4,
307
- name: 'other',
308
- title: 'Reprovado'
309
- }
310
- ]
311
- }
312
- },
313
- filters: {
314
- formationLevel(id) {
315
- const typeFormation = {
316
- 1: 'Ensino Médio',
317
- 2: 'Ensino Técnico',
318
- 3: 'Graduação',
319
- 4: 'Pós-Graduação',
320
- 5: 'Mestrado',
321
- 6: 'Doutorado',
322
- 8: 'Ensino Fundamental'
323
- };
324
-
325
- return typeFormation[id] || '-';
326
- }
327
- },
328
- components: {
329
- ElDropdown: Dropdown,
330
- ElDropdownMenu: DropdownMenu,
331
- ElDropdownItem: DropdownItem,
332
- MuxVideo
333
- },
334
- data() {
335
- return {
336
- isLocked: !this.companyHasProduct(
337
- this.$store.state.loja && this.$store.state.loja.showableProducts && this.$store.state.loja.showableProducts['INTERACAO_USUARIO'] || false
338
- ),
339
- unlockedButtons: ['share', 'moveTo'],
340
- isCvDownloading: false
341
- };
342
- },
343
- mounted() {
344
- this.userData.user_experience = this.filterByDate(
345
- this.userData.user_experience,
346
- 'old'
347
- );
348
- this.userData.user_education = this.filterByDate(
349
- this.userData.user_education,
350
- 'old'
351
- );
352
- this.userData.user_course = this.filterByDate(
353
- this.userData.user_course,
354
- 'old'
355
- );
356
- },
357
- watch: {
358
- userData() {
359
- this.userData.user_experience = this.filterByDate(
360
- this.userData.user_experience,
361
- 'old'
362
- );
363
- this.userData.user_education = this.filterByDate(
364
- this.userData.user_education,
365
- 'old'
366
- );
367
- this.userData.user_course = this.filterByDate(
368
- this.userData.user_course,
369
- 'old'
370
- );
371
- }
372
- },
373
- methods: {
374
- getFormattedValue(type, value) {
375
- if (!value || typeof value !== 'string') return '';
376
-
377
- const onlyDigits = value.replace(/\D/g, '');
378
-
379
- if (type === 'cpf') {
380
- if (onlyDigits.length !== 11) return value;
381
- return onlyDigits.replace(/(\d{3})(\d{3})(\d{3})(\d{2})/, '$1.$2.$3-$4');
382
- }
383
-
384
- if (type === 'rg') {
385
- if (onlyDigits.length < 7 || onlyDigits.length > 9) return value;
386
- return onlyDigits.replace(/^(\d{1,2})(\d{3})(\d{3})(\d?)$/, (match, p1, p2, p3, p4) => {
387
- let formatted = `${p1}.${p2}.${p3}`;
388
- if (p4) formatted += `-${p4}`;
389
- return formatted;
390
- });
391
- }
392
-
393
- if (type === 'birthDate') {
394
- const parts = onlyDigits.match(/^(\d{2})(\d{2})(\d{4})$/);
395
- if (!parts) return value;
396
- return `${parts[1]}/${parts[2]}/${parts[3]}`;
397
- }
398
-
399
- return value;
400
- },
401
- showMessage(message, type = 'success') {
402
- const Toast = swal.mixin({
403
- toast: true,
404
- position: 'top-end',
405
- showConfirmButton: false,
406
- timer: 3000,
407
- });
408
-
409
- return Toast.fire({
410
- type: type,
411
- title: message,
412
- });
413
- },
414
- async handleDownloadCv(data) {
415
- this.isCvDownloading = true;
416
-
417
- const response = await axios.get(data.annex, {
418
- responseType: 'blob'
419
- })
420
- .then(res => URL.createObjectURL(res.data))
421
- .catch(err => {
422
- return {
423
- error: true,
424
- message: (err && err.response && err.response.data && err.response.data.message) || 'Falha ao baixar arquivo'
425
- };
426
- });
427
-
428
- this.isCvDownloading = false;
429
-
430
- if (response.error) {
431
- this.showMessage(response.message, 'error');
432
- return;
433
- }
434
-
435
- const link = document.createElement('a');
436
- link.href = response;
437
- link.download = `${data.user_id}.pdf`;
438
- link.click();
439
- },
440
- getPhoneFormatted(phoneNumber) {
441
- const formattedPhoneNumber = parsePhoneNumber(phoneNumber, { regionCode: 'BR' });
442
-
443
- return (
444
- formattedPhoneNumber &&
445
- formattedPhoneNumber.number &&
446
- formattedPhoneNumber.number.national
447
- ) || phoneNumber;
448
- },
449
- highlightText(search, text) {
450
- if (search.length < 2) return text;
451
-
452
- const regex = new RegExp(search.toLowerCase(), 'gmi');
453
- return String(text || '').replace(
454
- regex,
455
- `<span class="search-highlight">${search}</span>`
456
- );
457
- },
458
- filterByDate(data, by = 'new') {
459
- let sortedArray = data.sort((a, b) => {
460
- a = [
461
- a.start_month,
462
- a.start_year,
463
- a.end_month || 12,
464
- a.end_year || 9999
465
- ];
466
-
467
- b = [
468
- b.start_month,
469
- b.start_year,
470
- b.end_month || 12,
471
- b.end_year || 9999
472
- ];
473
-
474
- // Primeiro filtro -> chaves: 0 e 1 -> Filtro por data de inicio
475
- // Segundo filtro -> chaves: 2 e 3 -> Filtro por data de termino (subir não concluídos para primeiros)
476
-
477
- let byStart;
478
- let byEnd;
479
-
480
- switch (by) {
481
- case 'old':
482
- byStart =
483
- new Date(a[1], a[0], 1).getTime() -
484
- new Date(b[1], b[0], 1).getTime();
485
- byEnd =
486
- new Date(b[3], b[2], 1).getTime() -
487
- new Date(a[3], a[2], 1).getTime();
488
- break;
489
-
490
- default:
491
- byStart =
492
- new Date(b[1], b[0], 1).getTime() -
493
- new Date(a[1], a[0], 1).getTime();
494
- byEnd =
495
- new Date(b[3], b[2], 1).getTime() -
496
- new Date(a[3], a[2], 1).getTime();
497
- break;
498
- }
499
-
500
- return byEnd - byStart;
501
- });
502
-
503
- return sortedArray;
504
- },
505
- toggleReadMore(event, id) {
506
- const element = document.getElementById(id);
507
- element.classList.toggle('readmore');
508
- event.target.innerText == 'Ler mais'
509
- ? (event.target.innerText = 'Esconder')
510
- : (event.target.innerText = 'Ler mais');
511
- },
512
- getTime(
513
- isExperience,
514
- { start_year = null, end_year = null, start_month, end_month },
515
- textHappening = 'Cursando'
516
- ) {
517
- const isHappening = !end_month && !end_year;
518
-
519
- if (isHappening) {
520
- return isExperience === true ? 'Atualmente' : textHappening;
521
- }
522
-
523
- const dateInitial = this.$moment(
524
- ['1', start_month.toString(), start_year.toString()],
525
- 'DD/MM/YYYY'
526
- );
527
- const dateDone = this.$moment(
528
- ['1', end_month.toString(), end_year.toString()],
529
- 'DD/MM/YYYY'
530
- );
531
- const diffDuration = this.$moment.duration(
532
- dateDone.diff(dateInitial)
533
- );
534
- const years = diffDuration.years();
535
- const months = diffDuration.months();
536
-
537
- if (years) {
538
- return years > 1 ? `(${years} anos)` : `(${years} ano)`;
539
- }
540
-
541
- return months > 1
542
- ? `(${months} meses)`
543
- : months == 1
544
- ? `(${months} mês)`
545
- : '';
546
- },
547
- languageLevel(level) {
548
- switch (parseInt(level)) {
549
- case 1:
550
- return 'Iniciante';
551
- case 2:
552
- return 'Elementar';
553
- case 3:
554
- return 'Pré-intermediário';
555
- case 4:
556
- return 'Intermediário';
557
- case 5:
558
- return 'Intermediário Superior';
559
- case 6:
560
- return 'Avançado';
561
- case 7:
562
- return 'Fluente';
563
- default:
564
- return '';
565
- }
566
- },
567
- treatPhone(phone) {
568
- if (phone) {
569
- if (phone == '0' || phone.length < 9 || !phone) {
570
- return 'não cadastrado';
571
- }
572
- }
573
-
574
- return phone;
575
- },
576
- treatCellphone(cellphone) {
577
- if (cellphone) {
578
- if (cellphone == '0' || cellphone.length < 11 || !cellphone) {
579
- return 'não cadastrado';
580
- }
581
- }
582
-
583
- return cellphone;
584
- },
585
- handleGetPrefixes(name = '') {
586
- return getPrefixes(name);
587
- },
588
- treatEndDate(end_month, end_year) {
589
- if (end_month && end_year) {
590
- return `${end_month}/${end_year}`;
591
- }
592
- return '';
593
- },
594
- wordIsLesserThan(word, value = 300) {
595
- return word && word.length < value;
596
- }
597
- }
598
- };
599
- </script>
600
-
601
- <style lang="scss" scoped>
602
- @import '@burh/nuxt-core/assets/sass/burh-ds/variables/_colors.scss';
603
-
604
- .mux__video {
605
- width: 100%;
606
- margin-top: 16px;
607
-
608
- video {
609
- width: 100% !important;
610
- max-height: 400px !important;
611
- border-radius: 8px !important;
612
- display: block !important;
613
- background: #212529 !important;
614
- }
615
- }
616
-
617
- .cv__box {
618
- cursor: pointer;
619
- margin: 0;
620
- border: 0;
621
- width: 100%;
622
- display: flex;
623
- align-items: center;
624
- justify-content: center;
625
- gap: 1rem;
626
- background: rgba(#5865f2, 0.2);
627
- color: #5865F2;
628
- font-size: 1rem;
629
- padding: 1.25rem 1rem;
630
- border-radius: 0.25rem;
631
- transition: background-color 0.25s, color 0.25s;
632
-
633
- &:hover:not(:disabled) {
634
- background: rgba(#5865f2, 0.3);
635
- }
636
-
637
- &:disabled {
638
- cursor: not-allowed !important;
639
- background: #f5f5f5;
640
- color: #c8c8c8;
641
- }
642
-
643
- @keyframes spinner {
644
- from {
645
- transform: rotate(0);
646
- }
647
- to {
648
- transform: rotate(360deg);
649
- }
650
- }
651
-
652
- .spin {
653
- animation: spinner 0.75s infinite linear;
654
- }
655
- }
656
-
657
- /deep/ .dropdown__content {
658
- &, .title__content {
659
- width: 100%;
660
- height: 100%;
661
- display: grid;
662
- place-items: center;
663
- }
664
- .title__content.icon {
665
- grid-template-columns: 1fr 10px;
666
- flex-direction: row;
667
- align-items: center;
668
- justify-content: space-between;
669
- color: #fff;
670
- font-weight: 600;
671
- font-size: 12px;
672
- margin: 0!important;
673
- i {
674
- font-size: 1rem;
675
- margin-left: 10px;
676
- }
677
- }
678
- }
679
-
680
- /deep/ .search-highlight {
681
- background: rgb(255, 252, 61);
682
- color: #000;
683
- }
684
-
685
- .content-middle {
686
- width: 50%;
687
- border-right: 1px solid #ececec5c;
688
- word-break: break-word !important;
689
- }
690
-
691
- .readmore {
692
- overflow: hidden;
693
- text-overflow: ellipsis;
694
- display: -webkit-box;
695
- -webkit-line-clamp: 3;
696
- -webkit-box-orient: vertical;
697
- }
698
-
699
- .tools {
700
- flex-wrap: wrap;
701
- display: grid;
702
- align-items: center;
703
- justify-content: space-between;
704
- grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
705
- gap: 10px;
706
- padding-right: 20px;
707
- button {
708
- display: flex;
709
- align-items: center;
710
- justify-content: center;
711
-
712
- margin-left: 0!important;
713
-
714
- height: 29px;
715
- border: none;
716
-
717
- background: #5865F2;
718
- border-radius: 16px;
719
- color: #fff;
720
-
721
- font-size: 0.75rem;
722
- font-weight: 600;
723
- outline: 0;
724
-
725
- padding: 0px 10px;
726
- .dropdown__icon {
727
- margin-right: 20px;
728
- }
729
- }
730
- }
731
-
732
- .education {
733
- margin-top: 15px;
734
- }
735
-
736
- .experience {
737
- .description {
738
- font-size: 14px;
739
- color: #62778c;
740
- }
741
-
742
- a {
743
- margin-bottom: 1px;
744
- }
745
- }
746
-
747
- .sub-title {
748
- margin-bottom: 1px;
749
-
750
- font-weight: 600;
751
- font-size: 14px;
752
- line-height: 21px;
753
- color: #62778c;
754
- text-transform: uppercase;
755
- }
756
-
757
- .info-text {
758
- margin-bottom: 1px;
759
-
760
- font-size: 14px;
761
- color: #8da2b5;
762
- }
763
-
764
- .content-block {
765
- p {
766
- font-size: 14px;
767
- color: #62778c;
768
- }
769
- }
770
-
771
- .no-info {
772
- p {
773
- font-size: 0.875rem;
774
- color: #62778c;
775
- }
776
- }
777
- </style>
1
+ <template>
2
+ <div class="bg-white content-middle">
3
+ <!-- FERRAMENTAS -->
4
+ <div class="tools mt-3">
5
+ <button
6
+ v-for="(tool, index) in tools"
7
+ :key="index"
8
+ class="ml-3 burh-color"
9
+ @click="
10
+ isLocked && !unlockedButtons.includes(tool.event)
11
+ ? $emit('open-contact')
12
+ : tool.event !== 'moveTo' && $emit(tool.event)
13
+ "
14
+ >
15
+ <template v-if="tool.event !== 'moveTo'">
16
+ <diamond v-if="isLocked && tool.event !== 'share'" class="mr-1" :size="16" />
17
+ {{ tool.name }}
18
+ </template>
19
+ <template v-else-if="tool.event === 'moveTo'">
20
+ <el-dropdown trigger="click" class="dropdown__content">
21
+ <span class="title__content icon">
22
+ {{tool.name}}
23
+ <i class="fas fa-angle-down dropdown__icon"></i>
24
+ </span>
25
+ <el-dropdown-menu slot="dropdown">
26
+ <el-dropdown-item
27
+ v-for="(tab, index) in moveToItems"
28
+ :key="index"
29
+ @click.native="$emit(tool.event, tab)"
30
+ >
31
+ <i class="fas fa-clipboard-list"></i>
32
+ {{ tab.title }}
33
+ </el-dropdown-item>
34
+ </el-dropdown-menu>
35
+ </el-dropdown>
36
+ </template>
37
+ </button>
38
+ </div>
39
+ <!-- CV -->
40
+ <div class="about content-block mt-5 ml-3 mr-3" v-if="userData.user_curriculum && userData.user_curriculum.annex">
41
+ <h5 class="font-weight-bold">
42
+ {{ $t('user_cv.middle_side.simplified_registration') }}
43
+ <el-tooltip
44
+ placement="top"
45
+ >
46
+ <div style="max-width: 300px" slot="content">
47
+ {{ $t('user_cv.middle_side.simplified_registration_tooltip') }}
48
+ </div>
49
+
50
+ <span class="text-primary ml-2">
51
+ <i class="fas fa-info-circle"></i>
52
+ </span>
53
+ </el-tooltip>
54
+
55
+ <button
56
+ class="cv__box mt-2"
57
+ :disabled="isCvDownloading"
58
+ @click="() => !isCvDownloading && handleDownloadCv(userData.user_curriculum)"
59
+ >
60
+ <template v-if="!isCvDownloading">
61
+ <span>
62
+ <i class="fas fa-download"></i>
63
+ </span>
64
+
65
+ <span class="font-weight-bold">{{ $t('user_cv.middle_side.download_cv') }}</span>
66
+ </template>
67
+
68
+ <template v-else>
69
+ <span>
70
+ <i class="fas fa-spinner spin"></i>
71
+ </span>
72
+
73
+ <span class="font-weight-bold">{{ $t('user_cv.middle_side.downloading') }}</span>
74
+ </template>
75
+ </button>
76
+ </h5>
77
+ </div>
78
+ <!-- CV -->
79
+ <!-- SOBRE -->
80
+ <div class="about content-block mt-5 ml-3 mr-3">
81
+ <h5 class="font-weight-bold">{{ $t('user_cv.middle_side.about') }}</h5>
82
+ <p
83
+ v-if="userData && userData.user_complementary_information && userData.user_complementary_information.about || false"
84
+ id="USER_ABOUT"
85
+ class="mb-0"
86
+ :class="
87
+ !wordIsLesserThan(
88
+ userData.user_complementary_information.about
89
+ ) && 'readmore'
90
+ "
91
+ v-html="
92
+ highlightText(
93
+ search,
94
+ userData.user_complementary_information.about
95
+ )
96
+ "
97
+ ></p>
98
+ <a
99
+ href="#"
100
+ aria-label="expandir conteudo"
101
+ v-if="
102
+ userData && userData.user_complementary_information && userData.user_complementary_information.about &&
103
+ !wordIsLesserThan(
104
+ userData.user_complementary_information.about
105
+ ) || false
106
+ "
107
+ @click.prevent.stop="toggleReadMore($event, 'USER_ABOUT')"
108
+ >{{ $t('user_cv.middle_side.read_more') }}</a
109
+ >
110
+
111
+ <p v-if="!(userData && userData.user_complementary_information && userData.user_complementary_information.about)" class="">
112
+ {{ $t('user_cv.middle_side.no_information_added') }}
113
+ </p>
114
+ </div>
115
+ <!-- VÍDEO DE APRESENTAÇÃO -->
116
+ <div
117
+ v-if="
118
+ userData &&
119
+ userData.user_complementary_information &&
120
+ userData.user_complementary_information.presentation_video"
121
+ class="about content-block mt-5 ml-3 mr-3"
122
+ >
123
+ <h5 class="font-weight-bold">{{ $t('user_cv.middle_side.presentation_video') }}</h5>
124
+
125
+ <div class="mux__video">
126
+ <MuxVideo
127
+ :src="userData.user_complementary_information.presentation_video"
128
+ />
129
+ </div>
130
+ </div>
131
+
132
+ <!-- DADOS PESSOAIS -->
133
+ <div v-if="userData && userData.user_complementary_information">
134
+ <h5 class="font-weight-bold mt-4 ml-3">{{ $t('user_cv.middle_side.personal_data') }}</h5>
135
+ <div class="ml-3 info-text">
136
+ <span v-if="userData.user_complementary_information.rg != null">RG: {{getFormattedValue('rg', userData.user_complementary_information.rg)}}<br></span>
137
+ <span v-if="userData.user_complementary_information.cpf != null">CPF: {{getFormattedValue('cpf', userData.user_complementary_information.cpf)}}<br></span>
138
+ <span v-if="userData.user_complementary_information.birth != null">Data de Nascimento: {{getFormattedValue('birthDate', userData.user_complementary_information.birth)}}<br></span>
139
+ <span v-if="userData.user_complementary_information.mother_name != null">{{ $t('user_cv.middle_side.mother_name_label') }} {{userData.user_complementary_information.mother_name}}<br></span>
140
+ </div>
141
+ </div>
142
+
143
+ <!-- CONTATO -->
144
+ <h5 class="font-weight-bold mt-4 ml-3">{{ $t('user_cv.middle_side.contacts') }}</h5>
145
+ <div class="ml-3 info-text">
146
+ <span v-if="userData.email != null">{{ $t('user_cv.middle_side.email_label') }} {{userData.email}}</span><br>
147
+ <span v-if="userData.user_contact && userData.user_contact.cellphone != null && userData.user_contact.cellphone.length > 1 ">{{ $t('user_cv.middle_side.cellphone_label') }} {{getPhoneFormatted(userData.user_contact.cellphone)}}</span><br>
148
+ <span v-if="userData.user_contact && userData.user_contact.phone != null && userData.user_contact.phone.length > 1">{{ $t('user_cv.middle_side.phone_label') }} {{getPhoneFormatted(userData.user_contact.phone)}}</span>
149
+ </div>
150
+
151
+ <!-- EDUCAÇÃO -->
152
+ <h5 class="font-weight-bold mt-4 ml-3">{{ $t('user_cv.middle_side.education') }}</h5>
153
+ <div
154
+ class=" ml-3"
155
+ v-show="userData.user_education.length > 0"
156
+ v-for="(edu, index) in userData.user_education"
157
+ :key="index"
158
+ >
159
+ <p
160
+ class="sub-title"
161
+ v-html="highlightText(search, edu.formation)"
162
+ ></p>
163
+ <p class="info-text">{{ edu.institution }}</p>
164
+ <span class="info-text">
165
+ {{ edu.start_month }}/{{ edu.start_year }} -
166
+ {{ treatEndDate(edu.end_month, edu.end_year) }}
167
+ {{ getTime(false, edu) }}
168
+ {{
169
+ edu.user_education_period
170
+ ? '-' + edu.user_education_period.name
171
+ : ''
172
+ }} </span
173
+ ><br />
174
+ <span
175
+ class="info-text"
176
+ >
177
+ {{getFormationLevel(edu.formation_level_id)}}
178
+ </span>
179
+ </div>
180
+
181
+ <!-- EXPERIÊNCIAS -->
182
+ <h5 class="font-weight-bold mt-4 ml-3">{{ $t('user_cv.middle_side.experience') }}</h5>
183
+ <div
184
+ class="no-info ml-3"
185
+ v-show="userData.user_experience.length === 0"
186
+ >
187
+ <p>
188
+ {{ $t('user_cv.middle_side.no_information_added') }}
189
+ </p>
190
+ </div>
191
+ <div
192
+ v-show="userData.user_experience.length > 0"
193
+ class="experience ml-3 mr-3"
194
+ v-for="(exp, index) in userData.user_experience"
195
+ :key="`experience-${index}`"
196
+ >
197
+ <p
198
+ class="sub-title"
199
+ v-html="highlightText(search, exp.job_title)"
200
+ ></p>
201
+ <p
202
+ class="info-text"
203
+ v-html="
204
+ highlightText(search, `${exp.company}, ${exp.location}`)
205
+ "
206
+ ></p>
207
+ <span class="info-text">
208
+ {{ exp.start_month }}/{{ exp.start_year }} -
209
+ {{ treatEndDate(exp.end_month, exp.end_year) }}
210
+ {{ getTime(true, exp) }}
211
+ </span>
212
+
213
+ <p
214
+ :id="`USER_EXPERIENCE-${index}`"
215
+ class="description mt-4 mb-0"
216
+ :class="!wordIsLesserThan(exp.description) && 'readmore'"
217
+ v-html="highlightText(search, exp.description)"
218
+ ></p>
219
+
220
+ <a
221
+ href="#"
222
+ aria-label="expandir conteudo"
223
+ v-show="!wordIsLesserThan(exp.description)"
224
+ @click.prevent.stop="
225
+ toggleReadMore($event, `USER_EXPERIENCE-${index}`)
226
+ "
227
+ >{{ $t('user_cv.middle_side.read_more') }}</a
228
+ ><br /><br />
229
+ </div>
230
+
231
+ <!-- CURSOS -->
232
+ <h5 class="font-weight-bold mt-1 ml-3">{{ $t('user_cv.middle_side.complementary_courses') }}</h5>
233
+ <div class="no-info ml-3" v-show="userData.user_course.length === 0">
234
+ <p>
235
+ {{ $t('user_cv.middle_side.no_information_added') }}
236
+ </p>
237
+ </div>
238
+ <div
239
+ v-show="userData.user_course.length > 0"
240
+ class="courses ml-3"
241
+ v-for="(cou, index) in userData.user_course"
242
+ :key="`course-${index}`"
243
+ >
244
+ <p
245
+ class="sub-title"
246
+ v-html="highlightText(search, cou.institution)"
247
+ ></p>
248
+ <p
249
+ class="info-text mb-3"
250
+ v-html="
251
+ highlightText(
252
+ search,
253
+ `${cou.name} - ${cou.end_year || ''} ${getTime(
254
+ false,
255
+ cou
256
+ )}`
257
+ )
258
+ "
259
+ />
260
+ </div>
261
+ </div>
262
+ </template>
263
+
264
+ <script>
265
+ import getPrefixes from '~/util/getPrefixes.js';
266
+ import { mask } from 'vue-the-mask';
267
+ import { Dropdown, DropdownMenu, DropdownItem } from 'element-ui';
268
+ import { parsePhoneNumber } from 'awesome-phonenumber';
269
+ import MuxVideo from '../../Video/MuxVideo.vue';
270
+
271
+ import swal from 'sweetalert2';
272
+ import axios from 'axios';
273
+
274
+ export default {
275
+ name: 'user-cv-middle',
276
+ directives: { mask },
277
+ props: {
278
+ userData: Object,
279
+ tools: {
280
+ type: Array,
281
+ default: () => []
282
+ },
283
+ search: {
284
+ type: String,
285
+ default: ''
286
+ },
287
+ moveToItems: {
288
+ type: Array,
289
+ default: () => [
290
+ {
291
+ id: 1,
292
+ name: 'applieds',
293
+ title: this.$t('user_cv.middle_side.move_to_applied')
294
+ },
295
+ {
296
+ id: 3,
297
+ name: 'selecteds',
298
+ title: this.$t('user_cv.middle_side.move_to_selected')
299
+ },
300
+ {
301
+ id: 5,
302
+ name: 'hireds',
303
+ title: this.$t('user_cv.middle_side.move_to_hired')
304
+ },
305
+ {
306
+ id: 4,
307
+ name: 'other',
308
+ title: this.$t('user_cv.middle_side.move_to_rejected')
309
+ }
310
+ ]
311
+ }
312
+ },
313
+ components: {
314
+ ElDropdown: Dropdown,
315
+ ElDropdownMenu: DropdownMenu,
316
+ ElDropdownItem: DropdownItem,
317
+ MuxVideo
318
+ },
319
+ data() {
320
+ return {
321
+ isLocked: !this.companyHasProduct(
322
+ this.$store.state.loja && this.$store.state.loja.showableProducts && this.$store.state.loja.showableProducts['INTERACAO_USUARIO'] || false
323
+ ),
324
+ unlockedButtons: ['share', 'moveTo'],
325
+ isCvDownloading: false
326
+ };
327
+ },
328
+ mounted() {
329
+ this.userData.user_experience = this.filterByDate(
330
+ this.userData.user_experience,
331
+ 'old'
332
+ );
333
+ this.userData.user_education = this.filterByDate(
334
+ this.userData.user_education,
335
+ 'old'
336
+ );
337
+ this.userData.user_course = this.filterByDate(
338
+ this.userData.user_course,
339
+ 'old'
340
+ );
341
+ },
342
+ watch: {
343
+ userData() {
344
+ this.userData.user_experience = this.filterByDate(
345
+ this.userData.user_experience,
346
+ 'old'
347
+ );
348
+ this.userData.user_education = this.filterByDate(
349
+ this.userData.user_education,
350
+ 'old'
351
+ );
352
+ this.userData.user_course = this.filterByDate(
353
+ this.userData.user_course,
354
+ 'old'
355
+ );
356
+ }
357
+ },
358
+ methods: {
359
+ getFormationLevel(id) {
360
+ const typeFormation = {
361
+ 1: this.$t('user_cv.middle_side.formation_level_high_school'),
362
+ 2: this.$t('user_cv.middle_side.formation_level_technical'),
363
+ 3: this.$t('user_cv.middle_side.formation_level_graduation'),
364
+ 4: this.$t('user_cv.middle_side.formation_level_post_graduation'),
365
+ 5: this.$t('user_cv.middle_side.formation_level_masters'),
366
+ 6: this.$t('user_cv.middle_side.formation_level_doctorate'),
367
+ 8: this.$t('user_cv.middle_side.formation_level_elementary')
368
+ };
369
+
370
+ return typeFormation[id] || '-';
371
+ },
372
+ getFormattedValue(type, value) {
373
+ if (!value || typeof value !== 'string') return '';
374
+
375
+ const onlyDigits = value.replace(/\D/g, '');
376
+
377
+ if (type === 'cpf') {
378
+ if (onlyDigits.length !== 11) return value;
379
+ return onlyDigits.replace(/(\d{3})(\d{3})(\d{3})(\d{2})/, '$1.$2.$3-$4');
380
+ }
381
+
382
+ if (type === 'rg') {
383
+ if (onlyDigits.length < 7 || onlyDigits.length > 9) return value;
384
+ return onlyDigits.replace(/^(\d{1,2})(\d{3})(\d{3})(\d?)$/, (match, p1, p2, p3, p4) => {
385
+ let formatted = `${p1}.${p2}.${p3}`;
386
+ if (p4) formatted += `-${p4}`;
387
+ return formatted;
388
+ });
389
+ }
390
+
391
+ if (type === 'birthDate') {
392
+ const parts = onlyDigits.match(/^(\d{2})(\d{2})(\d{4})$/);
393
+ if (!parts) return value;
394
+ return `${parts[1]}/${parts[2]}/${parts[3]}`;
395
+ }
396
+
397
+ return value;
398
+ },
399
+ showMessage(message, type = 'success') {
400
+ const Toast = swal.mixin({
401
+ toast: true,
402
+ position: 'top-end',
403
+ showConfirmButton: false,
404
+ timer: 3000,
405
+ });
406
+
407
+ return Toast.fire({
408
+ type: type,
409
+ title: message,
410
+ });
411
+ },
412
+ async handleDownloadCv(data) {
413
+ this.isCvDownloading = true;
414
+
415
+ const response = await axios.get(data.annex, {
416
+ responseType: 'blob'
417
+ })
418
+ .then(res => URL.createObjectURL(res.data))
419
+ .catch(err => {
420
+ return {
421
+ error: true,
422
+ message: (err && err.response && err.response.data && err.response.data.message) || this.$t('user_cv.middle_side.download_error')
423
+ };
424
+ });
425
+
426
+ this.isCvDownloading = false;
427
+
428
+ if (response.error) {
429
+ this.showMessage(response.message, 'error');
430
+ return;
431
+ }
432
+
433
+ const link = document.createElement('a');
434
+ link.href = response;
435
+ link.download = `${data.user_id}.pdf`;
436
+ link.click();
437
+ },
438
+ getPhoneFormatted(phoneNumber) {
439
+ const formattedPhoneNumber = parsePhoneNumber(phoneNumber, { regionCode: 'BR' });
440
+
441
+ return (
442
+ formattedPhoneNumber &&
443
+ formattedPhoneNumber.number &&
444
+ formattedPhoneNumber.number.national
445
+ ) || phoneNumber;
446
+ },
447
+ highlightText(search, text) {
448
+ if (search.length < 2) return text;
449
+
450
+ const regex = new RegExp(search.toLowerCase(), 'gmi');
451
+ return String(text || '').replace(
452
+ regex,
453
+ `<span class="search-highlight">${search}</span>`
454
+ );
455
+ },
456
+ filterByDate(data, by = 'new') {
457
+ let sortedArray = data.sort((a, b) => {
458
+ a = [
459
+ a.start_month,
460
+ a.start_year,
461
+ a.end_month || 12,
462
+ a.end_year || 9999
463
+ ];
464
+
465
+ b = [
466
+ b.start_month,
467
+ b.start_year,
468
+ b.end_month || 12,
469
+ b.end_year || 9999
470
+ ];
471
+
472
+ // Primeiro filtro -> chaves: 0 e 1 -> Filtro por data de inicio
473
+ // Segundo filtro -> chaves: 2 e 3 -> Filtro por data de termino (subir não concluídos para primeiros)
474
+
475
+ let byStart;
476
+ let byEnd;
477
+
478
+ switch (by) {
479
+ case 'old':
480
+ byStart =
481
+ new Date(a[1], a[0], 1).getTime() -
482
+ new Date(b[1], b[0], 1).getTime();
483
+ byEnd =
484
+ new Date(b[3], b[2], 1).getTime() -
485
+ new Date(a[3], a[2], 1).getTime();
486
+ break;
487
+
488
+ default:
489
+ byStart =
490
+ new Date(b[1], b[0], 1).getTime() -
491
+ new Date(a[1], a[0], 1).getTime();
492
+ byEnd =
493
+ new Date(b[3], b[2], 1).getTime() -
494
+ new Date(a[3], a[2], 1).getTime();
495
+ break;
496
+ }
497
+
498
+ return byEnd - byStart;
499
+ });
500
+
501
+ return sortedArray;
502
+ },
503
+ toggleReadMore(event, id) {
504
+ const element = document.getElementById(id);
505
+ element.classList.toggle('readmore');
506
+ event.target.innerText == this.$t('user_cv.middle_side.read_more')
507
+ ? (event.target.innerText = this.$t('user_cv.middle_side.hide'))
508
+ : (event.target.innerText = this.$t('user_cv.middle_side.read_more'));
509
+ },
510
+ getTime(
511
+ isExperience,
512
+ { start_year = null, end_year = null, start_month, end_month },
513
+ textHappening = null
514
+ ) {
515
+ const isHappening = !end_month && !end_year;
516
+ const happeningText = textHappening || this.$t('user_cv.middle_side.studying');
517
+
518
+ if (isHappening) {
519
+ return isExperience === true ? this.$t('user_cv.middle_side.currently') : happeningText;
520
+ }
521
+
522
+ const dateInitial = this.$moment(
523
+ ['1', start_month.toString(), start_year.toString()],
524
+ 'DD/MM/YYYY'
525
+ );
526
+ const dateDone = this.$moment(
527
+ ['1', end_month.toString(), end_year.toString()],
528
+ 'DD/MM/YYYY'
529
+ );
530
+ const diffDuration = this.$moment.duration(
531
+ dateDone.diff(dateInitial)
532
+ );
533
+ const years = diffDuration.years();
534
+ const months = diffDuration.months();
535
+
536
+ if (years) {
537
+ return years > 1 ? `(${years} ${this.$t('user_cv.middle_side.years_plural')})` : `(${years} ${this.$t('user_cv.middle_side.year_singular')})`;
538
+ }
539
+
540
+ return months > 1
541
+ ? `(${months} ${this.$t('user_cv.middle_side.months_plural')})`
542
+ : months == 1
543
+ ? `(${months} ${this.$t('user_cv.middle_side.month_singular')})`
544
+ : '';
545
+ },
546
+ languageLevel(level) {
547
+ const levelKeys = {
548
+ 1: 'beginner',
549
+ 2: 'elementary',
550
+ 3: 'pre_intermediate',
551
+ 4: 'intermediate',
552
+ 5: 'upper_intermediate',
553
+ 6: 'advanced',
554
+ 7: 'fluent'
555
+ };
556
+
557
+ const levelKey = levelKeys[parseInt(level)];
558
+ return levelKey ? this.$t(`user_cv.middle_side.language_levels.${levelKey}`) : '';
559
+ },
560
+ treatPhone(phone) {
561
+ if (phone) {
562
+ if (phone == '0' || phone.length < 9 || !phone) {
563
+ return 'não cadastrado';
564
+ }
565
+ }
566
+
567
+ return phone;
568
+ },
569
+ treatCellphone(cellphone) {
570
+ if (cellphone) {
571
+ if (cellphone == '0' || cellphone.length < 11 || !cellphone) {
572
+ return 'não cadastrado';
573
+ }
574
+ }
575
+
576
+ return cellphone;
577
+ },
578
+ handleGetPrefixes(name = '') {
579
+ return getPrefixes(name);
580
+ },
581
+ treatEndDate(end_month, end_year) {
582
+ if (end_month && end_year) {
583
+ return `${end_month}/${end_year}`;
584
+ }
585
+ return '';
586
+ },
587
+ wordIsLesserThan(word, value = 300) {
588
+ return word && word.length < value;
589
+ }
590
+ }
591
+ };
592
+ </script>
593
+
594
+ <style lang="scss" scoped>
595
+ @import '@burh/nuxt-core/assets/sass/burh-ds/variables/_colors.scss';
596
+
597
+ .mux__video {
598
+ width: 100%;
599
+ margin-top: 16px;
600
+
601
+ video {
602
+ width: 100% !important;
603
+ max-height: 400px !important;
604
+ border-radius: 8px !important;
605
+ display: block !important;
606
+ background: #212529 !important;
607
+ }
608
+ }
609
+
610
+ .cv__box {
611
+ cursor: pointer;
612
+ margin: 0;
613
+ border: 0;
614
+ width: 100%;
615
+ display: flex;
616
+ align-items: center;
617
+ justify-content: center;
618
+ gap: 1rem;
619
+ background: rgba(#5865f2, 0.2);
620
+ color: #5865F2;
621
+ font-size: 1rem;
622
+ padding: 1.25rem 1rem;
623
+ border-radius: 0.25rem;
624
+ transition: background-color 0.25s, color 0.25s;
625
+
626
+ &:hover:not(:disabled) {
627
+ background: rgba(#5865f2, 0.3);
628
+ }
629
+
630
+ &:disabled {
631
+ cursor: not-allowed !important;
632
+ background: #f5f5f5;
633
+ color: #c8c8c8;
634
+ }
635
+
636
+ @keyframes spinner {
637
+ from {
638
+ transform: rotate(0);
639
+ }
640
+ to {
641
+ transform: rotate(360deg);
642
+ }
643
+ }
644
+
645
+ .spin {
646
+ animation: spinner 0.75s infinite linear;
647
+ }
648
+ }
649
+
650
+ /deep/ .dropdown__content {
651
+ &, .title__content {
652
+ width: 100%;
653
+ height: 100%;
654
+ display: grid;
655
+ place-items: center;
656
+ }
657
+ .title__content.icon {
658
+ grid-template-columns: 1fr 10px;
659
+ flex-direction: row;
660
+ align-items: center;
661
+ justify-content: space-between;
662
+ color: #fff;
663
+ font-weight: 600;
664
+ font-size: 12px;
665
+ margin: 0!important;
666
+ i {
667
+ font-size: 1rem;
668
+ margin-left: 10px;
669
+ }
670
+ }
671
+ }
672
+
673
+ /deep/ .search-highlight {
674
+ background: rgb(255, 252, 61);
675
+ color: #000;
676
+ }
677
+
678
+ .content-middle {
679
+ width: 50%;
680
+ border-right: 1px solid #ececec5c;
681
+ word-break: break-word !important;
682
+ }
683
+
684
+ .readmore {
685
+ overflow: hidden;
686
+ text-overflow: ellipsis;
687
+ display: -webkit-box;
688
+ -webkit-line-clamp: 3;
689
+ -webkit-box-orient: vertical;
690
+ }
691
+
692
+ .tools {
693
+ flex-wrap: wrap;
694
+ display: grid;
695
+ align-items: center;
696
+ justify-content: space-between;
697
+ grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
698
+ gap: 10px;
699
+ padding-right: 20px;
700
+ button {
701
+ display: flex;
702
+ align-items: center;
703
+ justify-content: center;
704
+
705
+ margin-left: 0!important;
706
+
707
+ height: 29px;
708
+ border: none;
709
+
710
+ background: #5865F2;
711
+ border-radius: 16px;
712
+ color: #fff;
713
+
714
+ font-size: 0.75rem;
715
+ font-weight: 600;
716
+ outline: 0;
717
+
718
+ padding: 0px 10px;
719
+ .dropdown__icon {
720
+ margin-right: 20px;
721
+ }
722
+ }
723
+ }
724
+
725
+ .education {
726
+ margin-top: 15px;
727
+ }
728
+
729
+ .experience {
730
+ .description {
731
+ font-size: 14px;
732
+ color: #62778c;
733
+ }
734
+
735
+ a {
736
+ margin-bottom: 1px;
737
+ }
738
+ }
739
+
740
+ .sub-title {
741
+ margin-bottom: 1px;
742
+
743
+ font-weight: 600;
744
+ font-size: 14px;
745
+ line-height: 21px;
746
+ color: #62778c;
747
+ text-transform: uppercase;
748
+ }
749
+
750
+ .info-text {
751
+ margin-bottom: 1px;
752
+
753
+ font-size: 14px;
754
+ color: #8da2b5;
755
+ }
756
+
757
+ .content-block {
758
+ p {
759
+ font-size: 14px;
760
+ color: #62778c;
761
+ }
762
+ }
763
+
764
+ .no-info {
765
+ p {
766
+ font-size: 0.875rem;
767
+ color: #62778c;
768
+ }
769
+ }
770
+ </style>