|
@@ -16,7 +16,7 @@
|
|
<!-- Search form -->
|
|
<!-- Search form -->
|
|
<div class="search-container">
|
|
<div class="search-container">
|
|
<el-form :model="searchForm" label-width="100px" class="search-form">
|
|
<el-form :model="searchForm" label-width="100px" class="search-form">
|
|
- <el-row :gutter="20">
|
|
|
|
|
|
+ <el-row :gutter="5">
|
|
<el-col :span="6">
|
|
<el-col :span="6">
|
|
<el-form-item label="资讯发布日期">
|
|
<el-form-item label="资讯发布日期">
|
|
<div class="dateRange">
|
|
<div class="dateRange">
|
|
@@ -40,12 +40,12 @@
|
|
</div>
|
|
</div>
|
|
</el-form-item>
|
|
</el-form-item>
|
|
</el-col>
|
|
</el-col>
|
|
- <el-col :span="4">
|
|
|
|
|
|
+ <el-col :span="5">
|
|
<el-form-item label="来源名称">
|
|
<el-form-item label="来源名称">
|
|
<el-input v-model="searchForm.sourceName" placeholder="请输入来源" />
|
|
<el-input v-model="searchForm.sourceName" placeholder="请输入来源" />
|
|
</el-form-item>
|
|
</el-form-item>
|
|
</el-col>
|
|
</el-col>
|
|
- <el-col :span="4">
|
|
|
|
|
|
+ <el-col :span="5">
|
|
<el-form-item label="关键字">
|
|
<el-form-item label="关键字">
|
|
<el-input v-model="searchForm.key" placeholder="请输入关键字" />
|
|
<el-input v-model="searchForm.key" placeholder="请输入关键字" />
|
|
</el-form-item>
|
|
</el-form-item>
|
|
@@ -67,7 +67,7 @@
|
|
</el-select>
|
|
</el-select>
|
|
</el-form-item>
|
|
</el-form-item>
|
|
</el-col>
|
|
</el-col>
|
|
- <el-col :span="5" class="search-actions">
|
|
|
|
|
|
+ <el-col :span="4" class="search-actions">
|
|
<el-form-item label=" ">
|
|
<el-form-item label=" ">
|
|
<el-button type="primary" @click="handleSearch">搜索</el-button>
|
|
<el-button type="primary" @click="handleSearch">搜索</el-button>
|
|
<el-button @click="resetSearch">重置</el-button>
|
|
<el-button @click="resetSearch">重置</el-button>
|
|
@@ -83,7 +83,9 @@
|
|
:data="newsList"
|
|
:data="newsList"
|
|
style="width: 100%; flex: 1"
|
|
style="width: 100%; flex: 1"
|
|
v-loading="loading"
|
|
v-loading="loading"
|
|
- @selection-change="handleSelectionChange"
|
|
|
|
|
|
+ row-key="articleId"
|
|
|
|
+ @select="handleSelect"
|
|
|
|
+ @select-all="handleSelectAll"
|
|
border
|
|
border
|
|
stripe
|
|
stripe
|
|
highlight-current-row
|
|
highlight-current-row
|
|
@@ -136,7 +138,7 @@
|
|
v-if="scope.row.isEditing"
|
|
v-if="scope.row.isEditing"
|
|
v-model="scope.row.digest"
|
|
v-model="scope.row.digest"
|
|
type="textarea"
|
|
type="textarea"
|
|
- :rows="4"
|
|
|
|
|
|
+ :rows="8"
|
|
style="width: 100%"
|
|
style="width: 100%"
|
|
/>
|
|
/>
|
|
<span v-else>{{ scope.row.digest }}</span>
|
|
<span v-else>{{ scope.row.digest }}</span>
|
|
@@ -176,6 +178,7 @@
|
|
<el-button size="small" @click="showAddToReportDialog = true"
|
|
<el-button size="small" @click="showAddToReportDialog = true"
|
|
>加入已有报告</el-button
|
|
>加入已有报告</el-button
|
|
>
|
|
>
|
|
|
|
+ <el-button size="small" @click="clearSelection">清空选择</el-button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
@@ -305,6 +308,8 @@ const categories = ref<Category[]>([])
|
|
const reports = ref<Report[]>([])
|
|
const reports = ref<Report[]>([])
|
|
const loading = ref(false)
|
|
const loading = ref(false)
|
|
const selectedNews = ref<EditableNewsItem[]>([])
|
|
const selectedNews = ref<EditableNewsItem[]>([])
|
|
|
|
+// 存储当前页选中的数据(用于跨页选中)
|
|
|
|
+const currentPageSelected = ref<Set<number>>(new Set())
|
|
const showCreateReportDialog = ref(false)
|
|
const showCreateReportDialog = ref(false)
|
|
const showAddToReportDialog = ref(false)
|
|
const showAddToReportDialog = ref(false)
|
|
const showSelectedNews = ref(false)
|
|
const showSelectedNews = ref(false)
|
|
@@ -366,6 +371,14 @@ const fetchNews = async () => {
|
|
isEditing: false,
|
|
isEditing: false,
|
|
}))
|
|
}))
|
|
pagination.value.total = response.data.total
|
|
pagination.value.total = response.data.total
|
|
|
|
+ // 下一帧恢复选中状态(确保表格渲染完成)
|
|
|
|
+ nextTick(() => {
|
|
|
|
+ newsList.value.forEach((row) => {
|
|
|
|
+ if (currentPageSelected.value.has(row.articleId)) {
|
|
|
|
+ toggleRowSelection(row, true)
|
|
|
|
+ }
|
|
|
|
+ })
|
|
|
|
+ })
|
|
} catch (error) {
|
|
} catch (error) {
|
|
ElMessage.error('获取资讯列表失败')
|
|
ElMessage.error('获取资讯列表失败')
|
|
} finally {
|
|
} finally {
|
|
@@ -373,6 +386,10 @@ const fetchNews = async () => {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+const toggleRowSelection = (row: EditableNewsItem, selected: boolean) => {
|
|
|
|
+ newsTableRef.value?.toggleRowSelection(row, selected)
|
|
|
|
+}
|
|
|
|
+
|
|
const handleSearch = () => {
|
|
const handleSearch = () => {
|
|
// 重置到第一页
|
|
// 重置到第一页
|
|
pagination.value.currentPage = 1
|
|
pagination.value.currentPage = 1
|
|
@@ -504,6 +521,7 @@ const removeFromSelection = (news: EditableNewsItem) => {
|
|
const index = selectedNews.value.findIndex((item) => item.articleId === news.articleId)
|
|
const index = selectedNews.value.findIndex((item) => item.articleId === news.articleId)
|
|
if (index > -1) {
|
|
if (index > -1) {
|
|
selectedNews.value.splice(index, 1)
|
|
selectedNews.value.splice(index, 1)
|
|
|
|
+ currentPageSelected.value.delete(news.articleId)
|
|
newsTableRef.value?.toggleRowSelection(news, false)
|
|
newsTableRef.value?.toggleRowSelection(news, false)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -511,13 +529,43 @@ const removeFromSelection = (news: EditableNewsItem) => {
|
|
// Clear all selections
|
|
// Clear all selections
|
|
const clearSelection = async () => {
|
|
const clearSelection = async () => {
|
|
selectedNews.value = []
|
|
selectedNews.value = []
|
|
|
|
+ currentPageSelected.value = new Set()
|
|
// Also clear selection in the table
|
|
// Also clear selection in the table
|
|
newsTableRef.value?.clearSelection()
|
|
newsTableRef.value?.clearSelection()
|
|
}
|
|
}
|
|
|
|
|
|
-// Event handlers
|
|
|
|
-const handleSelectionChange = (selection: EditableNewsItem[]) => {
|
|
|
|
- selectedNews.value = selection
|
|
|
|
|
|
+// 选中某一行时触发
|
|
|
|
+const handleSelect = (selection: EditableNewsItem[], row: EditableNewsItem) => {
|
|
|
|
+ if (selection.includes(row)) {
|
|
|
|
+ // 选中
|
|
|
|
+ selectedNews.value.push(row)
|
|
|
|
+ currentPageSelected.value.add(row.articleId)
|
|
|
|
+ } else {
|
|
|
|
+ // 取消选中
|
|
|
|
+ selectedNews.value = selectedNews.value.filter((item) => item.articleId !== row.articleId)
|
|
|
|
+ currentPageSelected.value.delete(row.articleId)
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// 全选/取消全选
|
|
|
|
+const handleSelectAll = (selection: NewsItem[]) => {
|
|
|
|
+ const currentPageIds = new Set(newsList.value.map((item) => item.articleId))
|
|
|
|
+
|
|
|
|
+ if (selection.length > 0) {
|
|
|
|
+ // 全选
|
|
|
|
+ selection.forEach((item) => {
|
|
|
|
+ if (!selectedNews.value.some((selected) => selected.articleId === item.articleId)) {
|
|
|
|
+ selectedNews.value.push(item)
|
|
|
|
+ }
|
|
|
|
+ })
|
|
|
|
+ currentPageSelected.value = new Set([...currentPageSelected.value, ...currentPageIds])
|
|
|
|
+ } else {
|
|
|
|
+ // 取消全选
|
|
|
|
+ selectedNews.value = selectedNews.value.filter((item) => !currentPageIds.has(item.articleId))
|
|
|
|
+ currentPageSelected.value = new Set(
|
|
|
|
+ [...currentPageSelected.value].filter((articleId) => !currentPageIds.has(articleId))
|
|
|
|
+ )
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
const handleSizeChange = (val: number) => {
|
|
const handleSizeChange = (val: number) => {
|