|
|
@@ -12,6 +12,10 @@ import { routeToSearch } from "@/router";
|
|
|
import AdvancedSearchBox from "./components/AdvancedSearchBox.vue";
|
|
|
import type { SearchRouteParam } from "@/types/route.type";
|
|
|
import type { ResultMode, Sort } from "@/types/search.types";
|
|
|
+import FilterCard from "./components/FilterCard.vue";
|
|
|
+import { CompLog } from "@/helpers/log.helper";
|
|
|
+
|
|
|
+const logError = CompLog.logErr("SearchResultView")
|
|
|
|
|
|
const sideBarStore = useSideBarStore();
|
|
|
|
|
|
@@ -32,12 +36,14 @@ const pagination = reactive({
|
|
|
size: 10,
|
|
|
})
|
|
|
|
|
|
-let authorChecked: Ref<string[]> = ref([]);
|
|
|
-let yearChecked: Ref<string[]> = ref([]);
|
|
|
+const authorChecked: Ref<string[]> = ref([]);
|
|
|
+const yearChecked: Ref<string[]> = ref([]);
|
|
|
+const unitChecked = ref<string[]>();
|
|
|
|
|
|
const searchResult = computed(() => searchStore.result);
|
|
|
const yearAggResult = computed(() => searchStore.yearAggResult);
|
|
|
const authorAggResult = computed(() => searchStore.authorAggResult);
|
|
|
+const unitAggResult = computed(() => searchStore.unitAggResult);
|
|
|
|
|
|
const searchType: Ref<'simple' | 'advanced'> = ref('simple');
|
|
|
|
|
|
@@ -52,6 +58,7 @@ interface SearchParams {
|
|
|
query: string;
|
|
|
yearSelected?: string[];
|
|
|
authorSelected?: string[];
|
|
|
+ unitSelected?: string[];
|
|
|
sort?: Sort;
|
|
|
page?: number;
|
|
|
size?: number;
|
|
|
@@ -82,6 +89,9 @@ function performSearch(searchParams: SearchParams) {
|
|
|
if (searchParams.authorSelected && searchParams.authorSelected.length > 0) {
|
|
|
filters.push(`AU=(${searchParams.authorSelected.join(" OR ")})`);
|
|
|
}
|
|
|
+ if (searchParams.unitSelected && searchParams.unitSelected.length > 0) {
|
|
|
+ filters.push(`UN=(${searchParams.unitSelected.join(" OR ")})`)
|
|
|
+ }
|
|
|
const filter = filters.join(" AND ");
|
|
|
|
|
|
// size
|
|
|
@@ -102,17 +112,15 @@ function performSearch(searchParams: SearchParams) {
|
|
|
isSaveHis: true,
|
|
|
};
|
|
|
|
|
|
- searchStore.search(param).then(() => spinning.value = false).catch(() => spinning.value = false);
|
|
|
- searchStore.aggYear({
|
|
|
- ...commonParams,
|
|
|
- aggs: { year: { sort: "key/desc" } },
|
|
|
- size: 0,
|
|
|
- });
|
|
|
- searchStore.aggAuthor({
|
|
|
- ...commonParams,
|
|
|
- aggs: { AU: { sort: "count/desc" } },
|
|
|
- size: 0,
|
|
|
- });
|
|
|
+ searchStore.search(param)
|
|
|
+ .then(() => spinning.value = false)
|
|
|
+ .catch((err) => {
|
|
|
+ spinning.value = false
|
|
|
+ logError(err)
|
|
|
+ });
|
|
|
+ searchStore.aggYear(commonParams);
|
|
|
+ searchStore.aggAuthor(commonParams);
|
|
|
+ searchStore.aggUnit(commonParams);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -134,6 +142,7 @@ function doSearch() {
|
|
|
size: pagination.size,
|
|
|
yearSelected: yearChecked.value,
|
|
|
authorSelected: authorChecked.value,
|
|
|
+ unitSelected: unitChecked.value,
|
|
|
sort: sort.value,
|
|
|
}
|
|
|
routeToSearch(params, extras);
|
|
|
@@ -142,6 +151,7 @@ function doSearch() {
|
|
|
query: query.value,
|
|
|
yearSelected: yearChecked.value,
|
|
|
authorSelected: authorChecked.value,
|
|
|
+ unitSelected: unitChecked.value,
|
|
|
page: pagination.page,
|
|
|
size: pagination.size,
|
|
|
sort: sort.value,
|
|
|
@@ -243,16 +253,24 @@ function onModeChange(mode: ResultMode) {
|
|
|
resultMode.value = mode;
|
|
|
}
|
|
|
|
|
|
-function changeYearChecked() {
|
|
|
+function onYearFilterChange(selected: string[]) {
|
|
|
pagination.page = 1;
|
|
|
+ yearChecked.value = selected
|
|
|
doSearch();
|
|
|
}
|
|
|
|
|
|
-function changeAuthorChecked() {
|
|
|
+function onAuthorFilterChange(selected: string[]) {
|
|
|
pagination.page = 1;
|
|
|
+ authorChecked.value = selected
|
|
|
doSearch();
|
|
|
}
|
|
|
|
|
|
+function onUnitFilterChange(selected: string[]) {
|
|
|
+ pagination.page = 1;
|
|
|
+ unitChecked.value = selected
|
|
|
+ doSearch()
|
|
|
+}
|
|
|
+
|
|
|
onUnmounted(() => {
|
|
|
sideBarStore.setCollapse(false);
|
|
|
});
|
|
|
@@ -278,27 +296,27 @@ onUnmounted(() => {
|
|
|
筛选
|
|
|
</div>
|
|
|
<a-space direction="vertical" style="width: 100%" v-if="searchResult">
|
|
|
- <a-card title="年份">
|
|
|
- <a-checkbox-group v-model:value="yearChecked" style="width: 100%" @change="changeYearChecked"
|
|
|
- v-if="yearAggResult && yearAggResult.length > 0">
|
|
|
- <a-row v-for="(item, index) in yearAggResult" :key="index">
|
|
|
- <a-col :span="20">
|
|
|
- <a-checkbox :value="item.key">{{ item.key }}</a-checkbox>
|
|
|
- </a-col>
|
|
|
- <a-col :span="4"> {{ item.count }}</a-col>
|
|
|
- </a-row>
|
|
|
- </a-checkbox-group>
|
|
|
- </a-card>
|
|
|
- <a-card title="作者">
|
|
|
- <a-checkbox-group v-model:value="authorChecked" style="width: 100%" @change="changeAuthorChecked">
|
|
|
- <a-row v-for="(item, index) in authorAggResult" :key="index">
|
|
|
- <a-col :span="20">
|
|
|
- <a-checkbox :value="item.key">{{ item.key }}</a-checkbox>
|
|
|
- </a-col>
|
|
|
- <a-col :span="4"> {{ item.count }}</a-col>
|
|
|
- </a-row>
|
|
|
- </a-checkbox-group>
|
|
|
- </a-card>
|
|
|
+ <FilterCard
|
|
|
+ v-if="yearAggResult"
|
|
|
+ title="时间"
|
|
|
+ :aggs="yearAggResult"
|
|
|
+ :checked="yearChecked"
|
|
|
+ @change="onYearFilterChange"
|
|
|
+ />
|
|
|
+ <FilterCard
|
|
|
+ v-if="authorAggResult"
|
|
|
+ title="作者"
|
|
|
+ :aggs="authorAggResult"
|
|
|
+ :checked="authorChecked"
|
|
|
+ @change="onAuthorFilterChange"
|
|
|
+ />
|
|
|
+ <FilterCard
|
|
|
+ v-if="unitAggResult"
|
|
|
+ title="机构"
|
|
|
+ :aggs="unitAggResult"
|
|
|
+ :checked="unitChecked"
|
|
|
+ @change="onUnitFilterChange"
|
|
|
+ />
|
|
|
</a-space>
|
|
|
</a-col>
|
|
|
<a-col :span="19">
|