detail.vue 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. <template>
  2. <div class="modal">
  3. <el-dialog v-model="dialogVisible" :title="dialogTitle" :width="modalConfig.dialogWidth || '80%'" center
  4. @close="handleExcel(ruleFormRef)" :close-on-click-modal="false">
  5. <template #header>
  6. <pageTitle :title="dialogTitle"></pageTitle>
  7. </template>
  8. <div class="form">
  9. <el-form ref="ruleFormRef" :rules="modalConfig.formRules" :model="formData"
  10. :label-width="modalConfig.labelWidth || '100px'" size="large">
  11. <el-row :gutter="12">
  12. <template v-for="item in modalConfig.formItems" :key="item.prop">
  13. <el-col :span="item.span || 12">
  14. <el-form-item :label="item.label" :prop="item.prop">
  15. <template v-if="item.type === 'input'">
  16. <el-input :disabled="item.disabled" v-model="formData[item.prop]"
  17. :placeholder="item.placeholder" />
  18. </template>
  19. <template v-if="item.type === 'number'">
  20. <el-input v-model="formData[item.prop]" type="number" :min="0" :max="999999999999"
  21. :disabled="item.disabled" :placeholder="item.placeholder"/>
  22. </template>
  23. <template v-if="item.type === 'select'">
  24. <el-select v-model="formData[item.prop]" :placeholder="item.placeholder"
  25. style="width: 100%" :disabled="item.disabled">
  26. <template v-for="(val, index) in item.options" :key="index">
  27. <el-option :value="val.value" :label="val.label" />
  28. </template>
  29. </el-select>
  30. </template>
  31. <template v-if="item.type === 'date-picker'">
  32. <el-date-picker :type="item.dateType || 'daterange'" range-separator="-"
  33. start-placeholder="开始时间" end-placeholder="结束时间" v-model="formData[item.prop]"
  34. :disabled="item.disabled" />
  35. </template>
  36. </el-form-item>
  37. </el-col>
  38. </template>
  39. </el-row>
  40. </el-form>
  41. </div>
  42. <template #footer>
  43. <span class="dialog-footer">
  44. <el-button @click="handleExcel(ruleFormRef)">取消</el-button>
  45. <el-button type="primary" @click="handleConfirmClick(ruleFormRef)">确定</el-button>
  46. <slot name="button"></slot>
  47. </span>
  48. </template>
  49. </el-dialog>
  50. </div>
  51. </template>
  52. <script setup lang="ts" name="modal">
  53. import { reactive, ref } from 'vue';
  54. import type { FormInstance } from 'element-plus';
  55. import useSystemStore from '@/store/main';
  56. import { outTypeList } from '@/libs/commonMeth';
  57. import { template } from 'lodash';
  58. // 定义props
  59. interface IProps {
  60. modalConfig: {
  61. pageName: string;
  62. addTitle: string;
  63. editTitle: string;
  64. detailTitle: string;
  65. dialogWidth: string;
  66. labelWidth: string;
  67. formItems: any[];
  68. formRules: object;
  69. pageListParams?: object; //新增一个对象,用来传给特殊的列表接口刷新页面(非必传)
  70. };
  71. otherInfo?: any;
  72. }
  73. const props = defineProps<IProps>();
  74. const dialogVisible = ref(false);
  75. const isEdit = ref(false);
  76. const ruleFormRef = ref<FormInstance>();
  77. const systemStore = useSystemStore();
  78. const { pageDetailInfo, pageOperateType } = storeToRefs(systemStore);
  79. onMounted(async () => {});
  80. // 定义数据绑定
  81. const initialForm: any = {};
  82. for (const item of props.modalConfig.formItems) {
  83. initialForm[item.prop] = item.initialValue ?? '';
  84. }
  85. let formData = ref(JSON.parse(JSON.stringify(initialForm)));
  86. const dialogTitle = ref();
  87. // 新建或者编辑
  88. async function setDialogVisible(isNew: boolean = true, check: boolean = false) {
  89. dialogVisible.value = true;
  90. ruleFormRef.value?.resetFields();
  91. await nextTick();
  92. if (!isNew) {
  93. watch(pageDetailInfo, newVal => {
  94. formData.value = pageDetailInfo.value;
  95. });
  96. if (check) {
  97. dialogTitle.value = props.modalConfig.detailTitle;
  98. systemStore.getDetailType('detail');
  99. } else {
  100. dialogTitle.value = props.modalConfig.editTitle;
  101. systemStore.getDetailType('edit');
  102. }
  103. } else {
  104. props.modalConfig.formItems.map((m: any) => {
  105. if (m.numberType === '2') {
  106. if (m.prop === initialForm[m.prop]) {
  107. initialForm[m.prop] = (0.0).toFixed(2);
  108. }
  109. } else if (m.numberType === '1') {
  110. if (m.porp === initialForm[m.porp]) {
  111. initialForm[m.prop] = Math.trunc(0);
  112. }
  113. }
  114. });
  115. formData.value = JSON.parse(JSON.stringify(initialForm));
  116. await nextTick();
  117. dialogTitle.value = props.modalConfig.addTitle;
  118. systemStore.detailPageEval(initialForm);
  119. systemStore.getDetailType('add');
  120. }
  121. isEdit.value = !isNew;
  122. }
  123. // 点击确定
  124. function handleConfirmClick(formEl: FormInstance | undefined) {
  125. if (!formEl) return;
  126. formEl.validate((valid, fields) => {
  127. if (valid) {
  128. dialogVisible.value = false;
  129. let data = { ...formData.value };
  130. if (props.otherInfo) {
  131. data = { ...data, ...props.otherInfo };
  132. }
  133. if (!isEdit.value) {
  134. systemStore.newPageDataAction(
  135. props.modalConfig.pageName,
  136. data,
  137. props.modalConfig.pageListParams
  138. );
  139. } else {
  140. if (pageOperateType.value === 'edit') {
  141. systemStore.editPageDataAction(
  142. props.modalConfig.pageName,
  143. data,
  144. props.modalConfig.pageListParams
  145. );
  146. }
  147. }
  148. } else {
  149. console.log('error submit!', fields);
  150. }
  151. });
  152. }
  153. // 取消
  154. function handleExcel(formEl: FormInstance | undefined) {
  155. dialogVisible.value = false;
  156. if (!formEl) return;
  157. formEl.resetFields();
  158. }
  159. // 获取详情
  160. function onPageDetail(urlId: number | [] | string) {
  161. systemStore.detailPageDataAction(props.modalConfig.pageName, urlId);
  162. }
  163. defineExpose({
  164. setDialogVisible,
  165. onPageDetail,
  166. });
  167. </script>
  168. <style scoped lang="scss">
  169. .form {
  170. padding: 10px 30px;
  171. }
  172. </style>