|
@@ -5,10 +5,10 @@
|
|
|
:deleteText="domainDeletable ? '取消' : t('marketingConfig.deleteText')" :updateText="'新增'" :activeNames="['1']">
|
|
|
<template #default>
|
|
|
<div class="p-2 items-center flex flex-wrap">
|
|
|
- <template v-for="item in domains" :key="item.id">
|
|
|
+ <template v-for="item in domains" >
|
|
|
<!-- 具体域名 -->
|
|
|
- <el-tag v-if="item.sourceType == 2" @click="getDomainList(item)" effect="light" :closable="domainDeletable"
|
|
|
- @close="handleDeleteDomain(item)" color="#f4f4f4" round class="ml-1 cursor-pointer"
|
|
|
+ <el-tag v-if="item.sourceType == 2" @click="getDomainList(item)" effect="light" :closable="domainDeletable"
|
|
|
+ @close="handleDeleteDomain(item, 'domain')" color="#f4f4f4" round class="ml-1 cursor-pointer"
|
|
|
style="margin-bottom: 4px;">
|
|
|
{{ item.domain }}
|
|
|
</el-tag>
|
|
@@ -19,7 +19,7 @@
|
|
|
</div>
|
|
|
<template #reference>
|
|
|
<el-tag @click="getDomainList(item)" effect="light" :closable="domainDeletable"
|
|
|
- @close="handleDeleteDomain(item)" color="#f4f4f4" round class="ml-1 cursor-pointer"
|
|
|
+ @close="handleDeleteDomain(item, 'group')" color="#f4f4f4" round class="ml-1 cursor-pointer"
|
|
|
style="margin-bottom: 4px;">
|
|
|
{{ item.groupName }}
|
|
|
</el-tag>
|
|
@@ -37,6 +37,7 @@
|
|
|
|
|
|
<script setup lang="ts" name="domainCollapse">
|
|
|
import { useI18n } from 'vue-i18n';
|
|
|
+import { useMessage } from '/@/hooks/message';
|
|
|
const JCollapse = defineAsyncComponent(() => import('/@/components/JCollapse/index.vue'));
|
|
|
const DomainEdit = defineAsyncComponent(() => import('./domainEdit.vue'));
|
|
|
|
|
@@ -46,24 +47,36 @@ interface DomianItem {
|
|
|
sourceType: Number; // 1:分组 2:具体域名
|
|
|
groupId: String;
|
|
|
groupName: String;
|
|
|
+ modify: boolean; // 是否被修改/新增
|
|
|
}
|
|
|
|
|
|
const props = defineProps(['data']);
|
|
|
|
|
|
// 定义子组件向父组件传值/事件
|
|
|
-const emit = defineEmits(['refresh']);
|
|
|
+const emit = defineEmits(['refresh','domains', 'delDomains']);
|
|
|
const { t } = useI18n();
|
|
|
|
|
|
// 定义变量内容
|
|
|
-const domains = ref<DomianItem[]>([]);
|
|
|
const domainDeletable = ref(false);// 控制域名列表项是否可删除
|
|
|
const domainEditOpen = ref(false);
|
|
|
+const delDomains = ref<String[]>([]);
|
|
|
+const domains = ref<DomianItem[]>([]);
|
|
|
|
|
|
-watch(props.data, ()=>{
|
|
|
- if (props.data) {
|
|
|
- domains.value = props.data;
|
|
|
- }
|
|
|
-})
|
|
|
+watch(() => props.data, (newVal = []) => {
|
|
|
+ domains.value = [];
|
|
|
+ newVal.forEach((item: DomianItem) => {
|
|
|
+ item.modify = false;
|
|
|
+ domains.value = [...domains.value, item];
|
|
|
+ })
|
|
|
+}, { immediate: true });
|
|
|
+
|
|
|
+// 监听domains变化,emit给父组件
|
|
|
+watch(domains, (newVal) => {
|
|
|
+ emit('domains', newVal);
|
|
|
+}, { deep: true, immediate: true });
|
|
|
+watch(delDomains, (newVal) => {
|
|
|
+ emit('delDomains', newVal);
|
|
|
+}, { deep: true, immediate: true });
|
|
|
|
|
|
const getDomainList = (detail: DomianItem) => {
|
|
|
if (detail.sourceType == 1) {
|
|
@@ -73,13 +86,68 @@ const getDomainList = (detail: DomianItem) => {
|
|
|
}
|
|
|
|
|
|
// 删除域名
|
|
|
-const handleDeleteDomain = (deleteItem: DomianItem) => {
|
|
|
- domains.value = domains.value.filter((item: any) => item.id != deleteItem.id);
|
|
|
+const handleDeleteDomain = (deleteItem: DomianItem, type: 'group' | 'domain') => {
|
|
|
+ console.log(deleteItem)
|
|
|
+ domains.value = domains.value.filter(i=>{
|
|
|
+ if(!i.modify && i.id == deleteItem.id && !delDomains.value.includes(i.id)) {
|
|
|
+ delDomains.value = [...delDomains.value, i.id];
|
|
|
+ }
|
|
|
+ return i.id != deleteItem.id
|
|
|
+ });
|
|
|
}
|
|
|
|
|
|
-const addDomain = (data: DomianItem[]) => {
|
|
|
- console.log(data);
|
|
|
- domains.value = [...domains.value, ...data];
|
|
|
+// 分组去重
|
|
|
+function addGroupsUnique(newGroups: DomianItem[]) {
|
|
|
+ const existIds = new Set([
|
|
|
+ ...domains.value.map(item => item.id),
|
|
|
+ ]);
|
|
|
+ const filtered = newGroups.filter(item => !existIds.has(item.id));
|
|
|
+ if(filtered.length) {
|
|
|
+ filtered.forEach(item => {
|
|
|
+ Object.assign(item, {
|
|
|
+ "sourceType": 1,
|
|
|
+ "modify": true,
|
|
|
+ // "domain": "",
|
|
|
+ })
|
|
|
+ })
|
|
|
+ domains.value = [...domains.value, ...filtered];
|
|
|
+ console.log(filtered);
|
|
|
+ useMessage().success(t('common.addSuccessText'));
|
|
|
+ }else{
|
|
|
+ useMessage().warning('分组重复');
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// 域名去重
|
|
|
+function addSinglesUnique(newSingles: DomianItem[]) {
|
|
|
+ const existDomains = new Set([
|
|
|
+ ...domains.value.map(item => item.domain),
|
|
|
+ ]);
|
|
|
+ const filtered = newSingles.filter(item => !existDomains.has(item.domain));
|
|
|
+ if(filtered.length) {
|
|
|
+ filtered.forEach(item => {
|
|
|
+ Object.assign(item, {
|
|
|
+ "sourceType": 2,
|
|
|
+ "modify": true,
|
|
|
+ // "groupId": 0,
|
|
|
+ // "groupName": "",
|
|
|
+ // "domain": "",
|
|
|
+ })
|
|
|
+ })
|
|
|
+ domains.value = [...domains.value, ...filtered];
|
|
|
+ console.log(filtered);
|
|
|
+ useMessage().success(t('common.addSuccessText'));
|
|
|
+ }else{
|
|
|
+ useMessage().warning('域名重复');
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+const addDomain = (data: DomianItem[], type: 'group' | 'domain') => {
|
|
|
+ if (type === 'domain') {
|
|
|
+ data.length && addSinglesUnique(data);
|
|
|
+ } else {
|
|
|
+ data.length && addGroupsUnique(data);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
</script>
|