index.vue 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. <template>
  2. <el-dialog
  3. v-model="dialogVisible"
  4. :close-on-click-modal="false"
  5. :title="parameter.title"
  6. :destroy-on-close="true"
  7. :append-to-body="true"
  8. :width="parameter.width"
  9. :top="parameter.top"
  10. draggable
  11. >
  12. <ProTable
  13. ref="proTable"
  14. height="50vh"
  15. :tool-button="parameter.toolButton"
  16. :columns="parameter.columns"
  17. :row-key="parameter.rowKey"
  18. :request-api="parameter.getTableList"
  19. :init-param="parameter.initParam"
  20. :data-callback="dataCallback"
  21. />
  22. <template #footer>
  23. <span class="dialog-footer">
  24. <el-button type="primary" :loading="butLoading" @click="handleSubmit">确认</el-button>
  25. <el-button @click="handleCancel">取消</el-button>
  26. </span>
  27. </template>
  28. </el-dialog>
  29. </template>
  30. <script setup lang="ts" name="FormDialog">
  31. import { ref } from 'vue'
  32. import ProTable from '@/components/ProTable/index.vue'
  33. import { ElMessage } from 'element-plus'
  34. import { ProTableInstance, ColumnProps } from '@/components/ProTable/interface'
  35. export interface TableParameterProps {
  36. title?: string // 标题
  37. width?: number // 弹框宽度
  38. top?: string // 离顶部距离
  39. toolButton?: boolean
  40. initParam?: any // 初始化参数
  41. apiParam?: (params?: any) => any
  42. rowKey?: string
  43. api?: (params: any) => Promise<any> // 表单提交api
  44. columns?: ColumnProps[] // 动态表单字段
  45. getTableList?: (params: any) => Promise<any> // 获取表格数据的Api
  46. backTableList?: (params: any) => Promise<any> // 返回主表表格数据的Api
  47. }
  48. // dialog状态
  49. const dialogVisible = ref(false)
  50. const butLoading = ref(false)
  51. // 接受父组件参数,配置默认值
  52. // const parameter = ref<TableParameterProps>({
  53. // title: '',
  54. // width: 600,
  55. // top: '5vh',
  56. // toolButton: false,
  57. // columns: [] as ColumnProps[]
  58. // })
  59. let parameter = withDefaults(defineProps<TableParameterProps>(), {
  60. title: '',
  61. width: 600,
  62. top: '10vh',
  63. rowKey: 'id',
  64. toolButton: false,
  65. initParam: {},
  66. columns: () => []
  67. })
  68. // ProTable 实例
  69. const proTable = ref<ProTableInstance>()
  70. const dataCallback = (data: any) => {
  71. const page = proTable.value!.pageable
  72. return {
  73. list: data.data,
  74. total: data.total,
  75. pageNum: page.pageNum,
  76. pageSize: page.pageSize
  77. }
  78. }
  79. // 定义 emit 事件
  80. const emit = defineEmits<{
  81. submitForm: []
  82. }>()
  83. // 表单提交校验
  84. const handleSubmit = () => {
  85. butLoading.value = true
  86. if (!proTable.value?.selectedList.length) {
  87. ElMessage.warning('请选择数据')
  88. butLoading.value = false
  89. return
  90. }
  91. debugger
  92. let paramObj: any = undefined
  93. let params: any[] | undefined = []
  94. if (parameter.apiParam) {
  95. paramObj = parameter.apiParam(proTable.value?.selectedList)
  96. } else {
  97. params = proTable.value?.selectedList.map(item => item[parameter.rowKey])
  98. }
  99. parameter.api!(paramObj || params).then(res => {
  100. if (res.code == 200) {
  101. ElMessage.success('操作成功')
  102. dialogVisible.value = false
  103. emit('submitForm')
  104. } else {
  105. console.log('message', res.message)
  106. }
  107. })
  108. butLoading.value = false
  109. }
  110. // 取消按钮,重置表单,关闭弹框
  111. const handleCancel = () => {
  112. butLoading.value = false
  113. dialogVisible.value = false
  114. }
  115. // 接收父组件参数
  116. const openDialog = (params: TableParameterProps) => {
  117. parameter = { ...parameter, ...params }
  118. butLoading.value = false
  119. dialogVisible.value = true
  120. }
  121. defineExpose({
  122. openDialog,
  123. proTable,
  124. handleCancel
  125. })
  126. </script>
  127. <style scoped lang="scss"></style>