AttachmentSelector.vue 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. <script setup lang="ts">
  2. import { ref, watch } from 'vue'
  3. const props = defineProps<{
  4. visible?: boolean
  5. title?: string
  6. list?: any[]
  7. }>()
  8. const emit = defineEmits<{
  9. (e: 'update:visible', val: boolean): void
  10. (e: 'select', row: any): void
  11. }>()
  12. const localVisible = ref(false)
  13. const selectedRow = ref<any>(null)
  14. watch(
  15. () => props.visible,
  16. (val) => {
  17. localVisible.value = val || false
  18. if (val) selectedRow.value = null
  19. },
  20. { immediate: true }
  21. )
  22. const close = () => {
  23. localVisible.value = false
  24. emit('update:visible', false)
  25. }
  26. const handleSelect = (row: any) => {
  27. selectedRow.value = row
  28. }
  29. const handleConfirm = () => {
  30. if (!selectedRow.value) return
  31. emit('select', selectedRow.value)
  32. close()
  33. }
  34. const mockList = ref<any[]>([
  35. { id: 1, title: '示例数据1 - 2026年1月版本', createTime: '2026-01-15', version: 'V1.0' },
  36. { id: 2, title: '示例数据2 - 2026年3月版本', createTime: '2026-03-20', version: 'V1.1' },
  37. { id: 3, title: '示例数据3 - 2026年5月版本', createTime: '2026-05-10', version: 'V2.0' }
  38. ])
  39. </script>
  40. <template>
  41. <el-drawer
  42. v-model="localVisible"
  43. :title="`选择${title}数据`"
  44. size="60%"
  45. direction="rtl"
  46. destroy-on-close
  47. @close="close"
  48. >
  49. <el-alert
  50. title="请根据日期从以下列表中选择一份数据用于此附件"
  51. type="info"
  52. :closable="false"
  53. show-icon
  54. style="margin-bottom: 12px;"
  55. />
  56. <el-table
  57. :data="list && list.length > 0 ? list : mockList"
  58. border
  59. highlight-current-row
  60. @current-change="handleSelect"
  61. style="width: 100%"
  62. >
  63. <el-table-column type="index" label="序号" width="60" align="center" />
  64. <el-table-column prop="title" label="名称/说明" min-width="260" />
  65. <el-table-column prop="version" label="版本" width="100" align="center" />
  66. <el-table-column prop="createTime" label="日期/创建时间" width="160" align="center" />
  67. </el-table>
  68. <template #footer>
  69. <div style="text-align: right;">
  70. <el-button @click="close">取消</el-button>
  71. <el-button type="primary" :disabled="!selectedRow" @click="handleConfirm">确认选择</el-button>
  72. </div>
  73. </template>
  74. </el-drawer>
  75. </template>