|
@@ -14,9 +14,63 @@ const languageStatusList = [
|
|
|
'portugueseStatus'
|
|
'portugueseStatus'
|
|
|
]
|
|
]
|
|
|
|
|
|
|
|
|
|
+const allUnverifiedNumber = computed(() => {
|
|
|
|
|
+ return (
|
|
|
|
|
+ englishUnverifiedNumber.value +
|
|
|
|
|
+ simplifiedChineseUnverifiedNumber.value +
|
|
|
|
|
+ traditionalChineseUnverifiedNumber.value +
|
|
|
|
|
+ frenchUnverifiedNumber.value +
|
|
|
|
|
+ spanishUnverifiedNumber.value +
|
|
|
|
|
+ portugueseUnverifiedNumber.value
|
|
|
|
|
+ )
|
|
|
|
|
+})
|
|
|
|
|
+const englishUnverifiedNumber = computed(() => {
|
|
|
|
|
+ return showTableData.value.filter((item) => item.englishStatus === 0).length
|
|
|
|
|
+})
|
|
|
|
|
+const simplifiedChineseUnverifiedNumber = computed(() => {
|
|
|
|
|
+ return showTableData.value.filter((item) => item.simplifiedChineseStatus === 0).length
|
|
|
|
|
+})
|
|
|
|
|
+const traditionalChineseUnverifiedNumber = computed(() => {
|
|
|
|
|
+ return showTableData.value.filter((item) => item.traditionalChineseStatus === 0).length
|
|
|
|
|
+})
|
|
|
|
|
+const frenchUnverifiedNumber = computed(() => {
|
|
|
|
|
+ return showTableData.value.filter((item) => item.frenchStatus === 0).length
|
|
|
|
|
+})
|
|
|
|
|
+const spanishUnverifiedNumber = computed(() => {
|
|
|
|
|
+ return showTableData.value.filter((item) => item.spanishStatus === 0).length
|
|
|
|
|
+})
|
|
|
|
|
+const portugueseUnverifiedNumber = computed(() => {
|
|
|
|
|
+ return showTableData.value.filter((item) => item.portugueseStatus === 0).length
|
|
|
|
|
+})
|
|
|
|
|
+const curPageUnverifiedNumber = computed(() => {
|
|
|
|
|
+ return (
|
|
|
|
|
+ variableTableData.value.filter((item) =>
|
|
|
|
|
+ currnentTab.value.some((status) => item[status as keyof typeof item] === 0)
|
|
|
|
|
+ ).length || 0
|
|
|
|
|
+ )
|
|
|
|
|
+})
|
|
|
|
|
+
|
|
|
|
|
+const unverifiedNumberMap = computed(() => {
|
|
|
|
|
+ return {
|
|
|
|
|
+ all: allUnverifiedNumber.value,
|
|
|
|
|
+ english: englishUnverifiedNumber.value,
|
|
|
|
|
+ simplifiedChinese: simplifiedChineseUnverifiedNumber.value,
|
|
|
|
|
+ traditionalChinese: traditionalChineseUnverifiedNumber.value,
|
|
|
|
|
+ french: frenchUnverifiedNumber.value,
|
|
|
|
|
+ spanish: spanishUnverifiedNumber.value,
|
|
|
|
|
+ portuguese: portugueseUnverifiedNumber.value
|
|
|
|
|
+ }
|
|
|
|
|
+})
|
|
|
|
|
+
|
|
|
const tabList = ref([
|
|
const tabList = ref([
|
|
|
{ name: 'All', checked: true, number: 0, type: 'all', statusKey: languageStatusList },
|
|
{ name: 'All', checked: true, number: 0, type: 'all', statusKey: languageStatusList },
|
|
|
- { name: 'English', checked: false, number: 0, type: 'english', statusKey: 'englishStatus' },
|
|
|
|
|
|
|
+ {
|
|
|
|
|
+ name: 'English',
|
|
|
|
|
+ checked: false,
|
|
|
|
|
+ number: 0,
|
|
|
|
|
+ type: 'english',
|
|
|
|
|
+ statusKey: 'englishStatus'
|
|
|
|
|
+ },
|
|
|
{
|
|
{
|
|
|
name: 'Chinese (Simplified)',
|
|
name: 'Chinese (Simplified)',
|
|
|
checked: false,
|
|
checked: false,
|
|
@@ -105,6 +159,14 @@ const columnList = computed(() => {
|
|
|
return columns
|
|
return columns
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
|
|
+const isCheckedTab = (type, checked) => {
|
|
|
|
|
+ // all类型永远是true,当选中all类型时,其他类型都为true
|
|
|
|
|
+ if (type === 'all' || tabList.value[0].checked || checked) {
|
|
|
|
|
+ return true
|
|
|
|
|
+ } else {
|
|
|
|
|
+ return false
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
const tabChange = (newTabList) => {
|
|
const tabChange = (newTabList) => {
|
|
|
tabList.value = cloneDeep(newTabList)
|
|
tabList.value = cloneDeep(newTabList)
|
|
|
getMultilingualConfig()
|
|
getMultilingualConfig()
|
|
@@ -216,43 +278,6 @@ const showTableData = computed(() => {
|
|
|
return arr
|
|
return arr
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
-const englishUnverifiedNumber = computed(() => {
|
|
|
|
|
- return showTableData.value.filter((item) => item.englishStatus === 0).length
|
|
|
|
|
-})
|
|
|
|
|
-const simplifiedChineseUnverifiedNumber = computed(() => {
|
|
|
|
|
- return showTableData.value.filter((item) => item.simplifiedChineseStatus === 0).length
|
|
|
|
|
-})
|
|
|
|
|
-const traditionalChineseUnverifiedNumber = computed(() => {
|
|
|
|
|
- return showTableData.value.filter((item) => item.traditionalChineseStatus === 0).length
|
|
|
|
|
-})
|
|
|
|
|
-const frenchUnverifiedNumber = computed(() => {
|
|
|
|
|
- return showTableData.value.filter((item) => item.frenchStatus === 0).length
|
|
|
|
|
-})
|
|
|
|
|
-const spanishUnverifiedNumber = computed(() => {
|
|
|
|
|
- return showTableData.value.filter((item) => item.spanishStatus === 0).length
|
|
|
|
|
-})
|
|
|
|
|
-const portugueseUnverifiedNumber = computed(() => {
|
|
|
|
|
- return showTableData.value.filter((item) => item.portugueseStatus === 0).length
|
|
|
|
|
-})
|
|
|
|
|
-const curPageUnverifiedNumber = computed(() => {
|
|
|
|
|
- return (
|
|
|
|
|
- variableTableData.value.filter((item) =>
|
|
|
|
|
- currnentTab.value.some((status) => item[status as keyof typeof item] === 0)
|
|
|
|
|
- ).length || 0
|
|
|
|
|
- )
|
|
|
|
|
-})
|
|
|
|
|
-
|
|
|
|
|
-const unverifiedNumberMap = computed(() => {
|
|
|
|
|
- return {
|
|
|
|
|
- english: englishUnverifiedNumber.value,
|
|
|
|
|
- simplifiedChinese: simplifiedChineseUnverifiedNumber.value,
|
|
|
|
|
- traditionalChinese: traditionalChineseUnverifiedNumber.value,
|
|
|
|
|
- french: frenchUnverifiedNumber.value,
|
|
|
|
|
- spanish: spanishUnverifiedNumber.value,
|
|
|
|
|
- portuguese: portugueseUnverifiedNumber.value
|
|
|
|
|
- }
|
|
|
|
|
-})
|
|
|
|
|
-
|
|
|
|
|
const tableLoading = ref(false)
|
|
const tableLoading = ref(false)
|
|
|
|
|
|
|
|
const getMultilingualConfig = async () => {
|
|
const getMultilingualConfig = async () => {
|
|
@@ -388,6 +413,61 @@ onUnmounted(() => {
|
|
|
clearInterval(saveInterval)
|
|
clearInterval(saveInterval)
|
|
|
}
|
|
}
|
|
|
})
|
|
})
|
|
|
|
|
+
|
|
|
|
|
+interface ListItem {
|
|
|
|
|
+ name: string
|
|
|
|
|
+ number: number
|
|
|
|
|
+ type: string
|
|
|
|
|
+ checked: boolean
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+const getCheckedTabs = (tabList: ListItem[]) => {
|
|
|
|
|
+ const checkedList = tabList.filter((item) => item.checked)
|
|
|
|
|
+ return checkedList.map((item) => item.name)
|
|
|
|
|
+}
|
|
|
|
|
+// 判断是否除了all,其他的全选了
|
|
|
|
|
+const isAllExceptAllSelected = (tabList: ListItem[]) => {
|
|
|
|
|
+ const curCheckedTags = getCheckedTabs(tabList)
|
|
|
|
|
+ if (curCheckedTags.length === tabList.length - 1 && !curCheckedTags.includes('All')) {
|
|
|
|
|
+ return true
|
|
|
|
|
+ } else {
|
|
|
|
|
+ return false
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+// 点击标签 如果除了all
|
|
|
|
|
+const handleTagToggle = (index: any, checked: any) => {
|
|
|
|
|
+ // 如果点击的是all,并且当前选中也是all,那么直接返回
|
|
|
|
|
+ if (index === 0 && checked) return
|
|
|
|
|
+
|
|
|
|
|
+ const curTabList = cloneDeep(tabList.value)
|
|
|
|
|
+ if (index !== 0) {
|
|
|
|
|
+ const curTab = curTabList[index]
|
|
|
|
|
+ const curCheckedTags = getCheckedTabs(curTabList)
|
|
|
|
|
+ // 如果只选中了一个标签,并且这个标签不是all,那么改为选中all,取消选中当前选项
|
|
|
|
|
+ if (curCheckedTags.includes(curTab.name) && curCheckedTags.length === 1) {
|
|
|
|
|
+ curTabList[index].checked = false
|
|
|
|
|
+ curTabList[0].checked = true
|
|
|
|
|
+ tabChange(curTabList)
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+ curTabList[index].checked = !checked
|
|
|
|
|
+ const isCheckedAll = isAllExceptAllSelected(curTabList)
|
|
|
|
|
+ if (isCheckedAll) {
|
|
|
|
|
+ curTabList[0].checked = true
|
|
|
|
|
+ curTabList.forEach((item, index) => {
|
|
|
|
|
+ index !== 0 && (item.checked = false)
|
|
|
|
|
+ })
|
|
|
|
|
+ } else {
|
|
|
|
|
+ curTabList[0].checked = false
|
|
|
|
|
+ }
|
|
|
|
|
+ } else if (index === 0 && !checked) {
|
|
|
|
|
+ curTabList[0].checked = true
|
|
|
|
|
+ curTabList.forEach((item, index) => {
|
|
|
|
|
+ index !== 0 && (item.checked = false)
|
|
|
|
|
+ })
|
|
|
|
|
+ }
|
|
|
|
|
+ tabChange(curTabList)
|
|
|
|
|
+}
|
|
|
</script>
|
|
</script>
|
|
|
|
|
|
|
|
<template>
|
|
<template>
|
|
@@ -397,7 +477,34 @@ onUnmounted(() => {
|
|
|
</div>
|
|
</div>
|
|
|
<div class="page-filter">
|
|
<div class="page-filter">
|
|
|
<div class="language-tab">
|
|
<div class="language-tab">
|
|
|
- <FilterTabs :tabList="tabList" @tabChange="tabChange" />
|
|
|
|
|
|
|
+ <!-- <FilterTabs :tabList="tabList" @tabChange="tabChange" /> -->
|
|
|
|
|
+
|
|
|
|
|
+ <div class="body">
|
|
|
|
|
+ <div class="TagsBox">
|
|
|
|
|
+ <div
|
|
|
|
|
+ class="list"
|
|
|
|
|
+ v-for="(item, index) of tabList"
|
|
|
|
|
+ :key="item.name"
|
|
|
|
|
+ :class="[item.checked ? 'checked' : '']"
|
|
|
|
|
+ @click="handleTagToggle(index, item.checked)"
|
|
|
|
|
+ >
|
|
|
|
|
+ {{ item.name }}
|
|
|
|
|
+ <div
|
|
|
|
|
+ :class="[
|
|
|
|
|
+ 'v-tag',
|
|
|
|
|
+ item.type && 'v-tag__' + item.type,
|
|
|
|
|
+ item.checked ? 'checked_color' : ''
|
|
|
|
|
+ ]"
|
|
|
|
|
+ >
|
|
|
|
|
+ {{
|
|
|
|
|
+ isCheckedTab(item.type, item.checked)
|
|
|
|
|
+ ? unverifiedNumberMap[item.type]
|
|
|
|
|
+ : item.number
|
|
|
|
|
+ }}
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
</div>
|
|
</div>
|
|
|
<div class="top-content">
|
|
<div class="top-content">
|
|
|
<el-select
|
|
<el-select
|
|
@@ -593,6 +700,79 @@ onUnmounted(() => {
|
|
|
font-size: 10px;
|
|
font-size: 10px;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+.language-tab {
|
|
|
|
|
+ .body {
|
|
|
|
|
+ margin-top: 8.73px;
|
|
|
|
|
+ }
|
|
|
|
|
+ .TagsBox {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ flex-wrap: wrap;
|
|
|
|
|
+ }
|
|
|
|
|
+ .list {
|
|
|
|
|
+ // min-width: 93px;
|
|
|
|
|
+ padding: 5.42px 16px;
|
|
|
|
|
+ color: var(--color-neutral-2);
|
|
|
|
|
+ font-size: var(--font-size-3);
|
|
|
|
|
+ cursor: pointer;
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ justify-content: center;
|
|
|
|
|
+ border-radius: var(--border-radius-12);
|
|
|
|
|
+ }
|
|
|
|
|
+ .v-tag {
|
|
|
|
|
+ min-width: 18px;
|
|
|
|
|
+ font-size: var(--font-size-2);
|
|
|
|
|
+ margin-left: 8px;
|
|
|
|
|
+ border-radius: 6px;
|
|
|
|
|
+ padding: 3px 4px;
|
|
|
|
|
+ text-align: center;
|
|
|
|
|
+ }
|
|
|
|
|
+ .v-tag__all {
|
|
|
|
|
+ font-weight: 400;
|
|
|
|
|
+ background-color: var(--color-tag-all-bg-color);
|
|
|
|
|
+ color: #e26394;
|
|
|
|
|
+ }
|
|
|
|
|
+ .v-tag__english {
|
|
|
|
|
+ font-weight: 400;
|
|
|
|
|
+ background-color: var(--color-tag-created-bg);
|
|
|
|
|
+ color: var(--color-tag-created);
|
|
|
|
|
+ }
|
|
|
|
|
+ .v-tag__simplifiedChinese {
|
|
|
|
|
+ font-weight: 400;
|
|
|
|
|
+ background-color: var(--color-tag-chinese-simplified-bg);
|
|
|
|
|
+ color: var(--color-tag-confirmed);
|
|
|
|
|
+ }
|
|
|
|
|
+ .v-tag__traditionalChinese {
|
|
|
|
|
+ font-weight: 400;
|
|
|
|
|
+ background-color: var(--color-tag-chinese-traditional-bg);
|
|
|
|
|
+ color: var(--color-tag-chinese-traditional);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .v-tag__french {
|
|
|
|
|
+ font-weight: 400;
|
|
|
|
|
+ background-color: var(--color-tag-cargo-received-bg);
|
|
|
|
|
+ color: var(--color-tag-cargo-received);
|
|
|
|
|
+ }
|
|
|
|
|
+ .v-tag__spanish {
|
|
|
|
|
+ font-weight: 400;
|
|
|
|
|
+ background-color: var(--color-tag-spanish-bg);
|
|
|
|
|
+ color: var(--color-tag-spanish);
|
|
|
|
|
+ }
|
|
|
|
|
+ .v-tag__portuguese {
|
|
|
|
|
+ font-weight: 400;
|
|
|
|
|
+ background-color: var(--color-tag-portuguese-bg);
|
|
|
|
|
+ color: var(--color-tag-portuguese-text-color);
|
|
|
|
|
+ }
|
|
|
|
|
+ .checked {
|
|
|
|
|
+ color: var(--color-theme);
|
|
|
|
|
+ font-weight: 700;
|
|
|
|
|
+ background: var(--color-tag-checked-bg);
|
|
|
|
|
+ }
|
|
|
|
|
+ .checked_color {
|
|
|
|
|
+ background-color: var(--color-tag-all-bg);
|
|
|
|
|
+ color: var(--color-tag-all);
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
.header {
|
|
.header {
|
|
|
position: sticky;
|
|
position: sticky;
|
|
|
top: 0;
|
|
top: 0;
|