table.vue 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  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.actions="{ item }">
  31. <div v-if="tab === '0'">
  32. <v-btn color="primary" variant="text" @click="previewFile(item.url)">查看简历</v-btn>
  33. <v-btn color="primary" variant="text" @click="handleAction('', 0, item)">不合适</v-btn>
  34. </div>
  35. <div v-if="tab === '1'">
  36. <v-btn color="primary" variant="text" @click="handleAction('', 1, item)">入职</v-btn>
  37. </div>
  38. </template>
  39. </v-data-table>
  40. </div>
  41. </template>
  42. <script setup>
  43. defineOptions({ name: 'table-page'})
  44. import { ref, computed } from 'vue'
  45. import { previewFile } from '@/utils'
  46. import { joinEliminate, personEntryByEnterprise } from '@/api/enterprise'
  47. import { useI18n } from '@/hooks/web/useI18n'
  48. import Snackbar from '@/plugins/snackbar'
  49. const { t } = useI18n()
  50. const emit = defineEmits(['refresh'])
  51. const props = defineProps({
  52. tab: String,
  53. items: Array
  54. })
  55. const badgeColor = computed(() => (item) => {
  56. return (item.person && item.person.sex) ? (item.person.sex === '1' ? '#1867c0' : 'error') : 'error'
  57. })
  58. const badgeIcon = computed(() => (item) => {
  59. return (item.person && item.person.sex) ? (item.person.sex === '1' ? 'mdi-gender-male' : 'mdi-gender-female') : 'mdi-gender-female'
  60. })
  61. const selected = ref([])
  62. const defaultHeaders = [
  63. { title: '牛人', value: 'name' },
  64. { title: '应聘职位', value: 'job.name' },
  65. { title: '求职状态', key: 'person.jobStatusName' },
  66. { title: '工作经验', key: 'person.expName' },
  67. { title: '最高学历', key: 'person.eduName' },
  68. { title: '岗位薪资', key: 'job', value: item => `${item.job.payFrom}-${item.job.payTo}/${item.job.payName}`},
  69. { title: '操作', value: 'actions' }
  70. ]
  71. const headers = ref(defaultHeaders)
  72. if (props.tab === '5614') headers.value.splice(headers.value.length - 1, 0, { title: '推荐人', key: 'recommend' })
  73. else if (props.tab === '5615') headers.value.splice(headers.value.length - 1, 0, { title: '已结算赏金', key: 'settlementBounty' })
  74. else headers.value = defaultHeaders
  75. // 人才详情
  76. const handleToPersonDetail = ({ userId, id }) => {
  77. if (!userId || !id) return
  78. window.open(`/enterprise/talentPool/details/${userId}?id=${id}`)
  79. }
  80. const apiList = [
  81. joinEliminate, // 不合适
  82. personEntryByEnterprise // 入职
  83. ]
  84. // 不合适、入职
  85. const handleAction = async (type, index, item) => {
  86. const ids = type ? selected.value : [item?.id]
  87. if (!ids) return
  88. await apiList[index](ids)
  89. Snackbar.success(t('common.operationSuccessful'))
  90. emit('refresh')
  91. }
  92. </script>
  93. <style scoped lang="scss">
  94. :deep(.v-table > .v-table__wrapper > table > thead) {
  95. background-color: #f7f8fa !important;
  96. }
  97. :deep(.v-selection-control__input) {
  98. // color: var(--v-primary-base) !important;
  99. color: #767778;
  100. }
  101. </style>