table.vue 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. <template>
  2. <div>
  3. <div class="text-end">
  4. <v-btn v-if="tab === '0'" color="primary" :disabled="selected.length ? false : true" variant="tonal" @click="handleAction('all', 0)">不合适</v-btn>
  5. <v-btn v-if="tab === '1'" color="primary" :disabled="selected.length ? false : true" variant="tonal" @click="handleAction('all', 1)">入职</v-btn>
  6. </div>
  7. <v-data-table
  8. class="mt-3"
  9. v-model="selected"
  10. :items="items"
  11. :headers="headers"
  12. hover
  13. show-select
  14. height="60vh"
  15. item-value="id"
  16. >
  17. <template #bottom></template>
  18. <template v-slot:item.name="{ item }">
  19. <div class="d-flex align-center cursor-pointer" @click="handleToPersonDetail(item)">
  20. <v-badge
  21. bordered
  22. offset-y="6"
  23. :color="badgeColor(item)"
  24. :icon="badgeIcon(item)">
  25. <v-avatar size="40" :image="item.person.avatar || 'https://minio.citupro.com/dev/menduner/7.png'"></v-avatar>
  26. </v-badge>
  27. <span class="defaultLink ml-3">{{ item?.person?.name }}</span>
  28. </div>
  29. </template>
  30. <template v-slot:item.exp="{ item }">
  31. <span v-if="item?.jobExperience && Object.keys(item?.jobExperience).length">{{ item.jobExperience.positionName }} {{ item.jobExperience.enterpriseName }}</span>
  32. <span v-else>未填写工作经历</span>
  33. </template>
  34. <template v-slot:item.edu="{ item }">
  35. <span v-if="item?.eduExperience && Object.keys(item?.eduExperience).length">{{ timesTampChange(item.eduExperience.startTime).slice(0, 4) }}-{{ timesTampChange(item.eduExperience.endTime).slice(0, 4) }} {{ item.eduExperience.schoolName }}</span>
  36. <span v-else>未填写教育经历</span>
  37. </template>
  38. <template v-slot:item.actions="{ item }">
  39. <div v-if="tab === '0'">
  40. <v-btn color="primary" variant="text" @click="previewFile(item.url)">查看简历</v-btn>
  41. <v-btn color="primary" variant="text" @click="handleAction('', 0, item)">不合适</v-btn>
  42. </div>
  43. <div v-if="tab === '1'">
  44. <v-btn color="primary" variant="text" @click="handleAction('', 1, item)">入职</v-btn>
  45. </div>
  46. </template>
  47. </v-data-table>
  48. </div>
  49. </template>
  50. <script setup>
  51. defineOptions({ name: 'table-page'})
  52. import { ref, computed } from 'vue'
  53. import { previewFile } from '@/utils'
  54. import { timesTampChange } from '@/utils/date'
  55. import { joinEliminate, personEntryByEnterprise } from '@/api/enterprise'
  56. import { useI18n } from '@/hooks/web/useI18n'
  57. import Snackbar from '@/plugins/snackbar'
  58. const { t } = useI18n()
  59. const emit = defineEmits(['refresh'])
  60. defineProps({
  61. tab: String,
  62. items: Array
  63. })
  64. const badgeColor = computed(() => (item) => {
  65. return (item.person && item.person.sex) ? (item.person.sex === '1' ? '#1867c0' : 'error') : 'error'
  66. })
  67. const badgeIcon = computed(() => (item) => {
  68. return (item.person && item.person.sex) ? (item.person.sex === '1' ? 'mdi-gender-male' : 'mdi-gender-female') : 'mdi-gender-female'
  69. })
  70. const selected = ref([])
  71. const headers = [
  72. { title: '牛人', value: 'name' },
  73. { title: '基本信息', key: 'info', value: item => `${item.eduName}·${ item.expName }` },
  74. { title: '最近工作经历', value: 'exp' },
  75. { title: '教育经历', key: 'edu' },
  76. { title: '应聘职位', value: 'job.name' },
  77. { title: '操作', value: 'actions' }
  78. ]
  79. // 人才详情
  80. const handleToPersonDetail = ({ userId, id }) => {
  81. if (!userId || !id) return
  82. window.open(`/enterprise/talentPool/details/${userId}?id=${id}`)
  83. }
  84. const apiList = [
  85. joinEliminate, // 不合适
  86. personEntryByEnterprise // 入职
  87. ]
  88. // 不合适、入职
  89. const handleAction = async (type, index, item) => {
  90. const ids = type ? selected.value : [item?.id]
  91. if (!ids) return
  92. await apiList[index](ids)
  93. Snackbar.success(t('common.operationSuccessful'))
  94. emit('refresh')
  95. }
  96. </script>
  97. <style scoped lang="scss">
  98. :deep(.v-table > .v-table__wrapper > table > thead) {
  99. background-color: #f7f8fa !important;
  100. }
  101. :deep(.v-selection-control__input) {
  102. // color: var(--v-primary-base) !important;
  103. color: #767778;
  104. }
  105. </style>