domainEdit.vue 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. <template>
  2. <el-dialog :title="type === 'Edit' ? '修改域名' : '添加域名'" width="600" v-model="props.open" :close-on-click-modal="false"
  3. :destroy-on-close="true" @close="onCancel" draggable>
  4. <el-form style="height: 80px;" ref="dialogFormRef" :rules="dataRules" :model="state.ruleForm"
  5. v-loading="loading">
  6. <div class="custom-style">
  7. <el-segmented v-model="activeName"
  8. :options="[t('marketingConfig.grouping'), t('marketingConfig.domain')]" size="default">
  9. <template #default="scope">
  10. <div style="min-width: 50px; line-height: 32px;">{{ scope.item }}</div>
  11. </template>
  12. </el-segmented>
  13. </div>
  14. <el-form-item label="" prop="grouping" v-if="activeName === t('marketingConfig.grouping')">
  15. <el-select multiple collapse-tags collapse-tags-tooltip :max-collapse-tags="5"
  16. v-model="state.ruleForm.selectedIds" :placeholder="t('marketingConfig.groupingTip')" clearable>
  17. <el-option v-for="item in listSelect" :key="item.id" :label="item.groupName" :value="item.id" />
  18. </el-select>
  19. </el-form-item>
  20. <el-form-item label="" prop="domain" v-else>
  21. <el-input v-model="state.ruleForm.domain" type="text"
  22. :placeholder="t('marketingConfig.domainTip')"></el-input>
  23. </el-form-item>
  24. </el-form>
  25. <template #footer>
  26. <span class="dialog-footer">
  27. <el-button @click="onCancel">{{ t('common.cancelButtonText') }}</el-button>
  28. <el-button type="primary" @click="onSubmit" :disabled="loading">{{ t('common.confirmButtonText')
  29. }}</el-button>
  30. </span>
  31. </template>
  32. </el-dialog>
  33. </template>
  34. <script setup lang="ts" name="systemMenuDialog">
  35. import { useI18n } from 'vue-i18n';
  36. import { pageListDomain } from '/@/api/marketing/config';
  37. import { useMessage } from '/@/hooks/message';
  38. // 定义子组件向父组件传值/事件
  39. const emit = defineEmits(['update:open', 'onsuccess']);
  40. const { t } = useI18n();
  41. interface DomainItem {
  42. domains: String[];
  43. groupName: String;
  44. id: String;
  45. }
  46. // 定义变量内容
  47. const loading = ref(false);
  48. const type = ref('add'); // 'add' or 'edit'
  49. const activeName = ref(t('marketingConfig.grouping'));
  50. const dialogFormRef = ref();
  51. const listSelect = ref<DomainItem[]>([]);
  52. const selectedObjects = ref<DomainItem[]>([]);
  53. // 定义需要的数据
  54. const state = reactive({
  55. ruleForm: {
  56. selectedIds: [] as String[], // 选中域名分组
  57. domain: [],
  58. },
  59. });
  60. const props = defineProps({
  61. open: {
  62. type: Boolean,
  63. default: false,
  64. },
  65. });
  66. // 表单校验规则
  67. const dataRules = reactive({
  68. domain: [
  69. { required: true, message: '域名不能为空', trigger: 'blur' }
  70. ],
  71. });
  72. const onCancel = () => {
  73. emit('update:open', false);
  74. };
  75. // 保存数据
  76. const onSubmit = async () => {
  77. selectedObjects.value = [];
  78. try {
  79. loading.value = true;
  80. console.log(state.ruleForm.selectedIds);
  81. selectedObjects.value = listSelect.value.filter(item=>state.ruleForm.selectedIds.includes(item.id));
  82. console.log(selectedObjects.value);
  83. useMessage().success(t('common.addSuccessText'));
  84. emit('onsuccess', selectedObjects.value);
  85. onCancel();
  86. } catch (err) {
  87. useMessage().error(err.msg);
  88. } finally {
  89. loading.value = false;
  90. }
  91. };
  92. const getDomainList = async ()=>{
  93. const data = await pageListDomain();
  94. listSelect.value = data.data;
  95. }
  96. onMounted(()=>{
  97. getDomainList();
  98. })
  99. </script>
  100. <style scoped>
  101. .apps-loadmore.el-select-dropdown .el-scrollbar__wrap {
  102. height: 330px !important;
  103. }
  104. .custom-style {
  105. margin-top: 14px;
  106. .el-segmented__item {
  107. border-right: 1px solid rgba(230, 230, 230, 1);
  108. min-width: 72px;
  109. flex: unset;
  110. }
  111. .el-segmented {
  112. border: 1px solid rgba(230, 230, 230, 1);
  113. border-bottom: unset;
  114. --el-segmented-bg-color: #ffffff;
  115. --el-segmented-item-hover-bg-color: rgba(22, 122, 240, 0.1);
  116. --el-segmented-item-selected-color: rgba(22, 122, 240, 1);
  117. --el-segmented-item-hover-color: rgba(22, 122, 240, 1);
  118. --el-segmented-item-selected-bg-color: rgba(22, 122, 240, 0.1);
  119. --el-border-radius-base: 4px 4px 0 0;
  120. --el-segmented-padding: 0;
  121. }
  122. }
  123. </style>