Skip to content

Commit

Permalink
feat: record the post query conditions in the route query parameters (#…
Browse files Browse the repository at this point in the history
…4102)

#### What type of PR is this?

/area console
/kind feature
/milestone 2.8.x

#### What this PR does / why we need it:

在文章数据管理列表页面路由中记录查询条件,包括分页信息、筛选信息等。可以保证在刷新页面或者从文章编辑页面返回时保留之前的查询状态。

<img width="1758" alt="image" src="https://github.com/halo-dev/halo/assets/21301288/270948d6-d585-4b36-ad3a-93064cf47548">

TODO:

- [x] 记录筛选条件,因为路由参数只能使用基本类型,但是原来的筛选条件的变量都是完整对象。

#### Which issue(s) this PR fixes:

Fixes #4098 

#### Special notes for your reviewer:

需要测试:

1. 文章管理列表的所有筛选项是否可以正常工作。
2. 尝试设置部分筛选,然后刷新页面,观察筛选条件是否正常保留。

#### Does this PR introduce a user-facing change?

```release-note
Console 端的文章管理列表支持在地址栏记录筛选条件。
```
  • Loading branch information
ruibaby committed Jul 12, 2023
1 parent 1970963 commit bb0a5f1
Show file tree
Hide file tree
Showing 4 changed files with 135 additions and 106 deletions.
8 changes: 4 additions & 4 deletions console/package.json
Expand Up @@ -67,10 +67,10 @@
"@uppy/status-bar": "^3.1.2",
"@uppy/vue": "^1.0.2",
"@uppy/xhr-upload": "^3.2.0",
"@vueuse/components": "^9.6.0",
"@vueuse/core": "^9.6.0",
"@vueuse/router": "^9.6.0",
"@vueuse/shared": "^9.6.0",
"@vueuse/components": "^10.2.0",
"@vueuse/core": "^10.2.0",
"@vueuse/router": "^10.2.0",
"@vueuse/shared": "^10.2.0",
"axios": "^0.27.2",
"codemirror": "^6.0.1",
"colorjs.io": "^0.4.3",
Expand Down
113 changes: 56 additions & 57 deletions console/packages/components/src/components/pagination/Pagination.vue
@@ -1,7 +1,6 @@
<script lang="ts" setup>
import { computed } from "vue";
import { IconArrowLeft, IconArrowRight } from "../../icons/icons";
import { ref, watch } from "vue";
import { useOffsetPagination } from "@vueuse/core";
const props = withDefaults(
defineProps<{
Expand All @@ -22,71 +21,69 @@ const props = withDefaults(
}
);
const page = ref(props.page);
const size = ref(props.size);
const total = ref(props.total);
watch([() => props.page, () => props.size, () => props.total], () => {
page.value = props.page;
size.value = props.size;
total.value = props.total;
});
const emit = defineEmits<{
(event: "update:page", page: number): void;
(event: "update:size", size: number): void;
(event: "change", value: { page: number; size: number }): void;
}>();
const onPageChange = ({
currentPage,
currentPageSize,
}: {
currentPage: number;
currentPageSize: number;
}) => {
emit("update:page", currentPage);
emit("update:size", currentPageSize);
emit("change", {
page: currentPage,
size: currentPageSize,
});
const totalPages = computed(() => Math.ceil(props.total / props.size));
const hasNext = computed(() => props.page < totalPages.value);
const hasPrevious = computed(() => props.page > 1);
const onPageChange = (event: Event) => {
const target = event.target as HTMLSelectElement;
const page = Number(target.value);
emit("update:page", page);
emit("change", { page, size: props.size });
};
const {
currentPage,
currentPageSize,
pageCount,
isFirstPage,
isLastPage,
prev,
next,
} = useOffsetPagination({
total: total,
page: page,
pageSize: size,
onPageChange: onPageChange,
onPageSizeChange: onPageChange,
});
const onSizeChange = (event: Event) => {
const target = event.target as HTMLSelectElement;
const size = Number(target.value);
emit("update:size", size);
// reset page to 1
emit("update:page", 1);
emit("change", { page: 1, size });
};
const previous = () => {
if (hasPrevious.value) {
const page = props.page - 1;
emit("update:page", page);
emit("change", { page: page, size: props.size });
}
};
const next = () => {
if (hasNext.value) {
const page = props.page + 1;
emit("update:page", page);
emit("change", { page: page, size: props.size });
}
};
</script>
<template>
<div class="bg-white flex items-center justify-between">
<div class="flex-1 flex justify-between sm:!hidden items-center">
<span
<button
class="relative inline-flex items-center px-4 py-2 border border-gray-300 text-sm font-medium rounded-md text-gray-700 bg-white hover:bg-gray-50 cursor-pointer"
@click="prev"
:disabled="!hasPrevious"
@click="previous"
>
<IconArrowLeft />
</span>
<span class="text-sm text-gray-500">
{{ currentPage }} / {{ pageCount }}
</span>
<span
</button>
<span class="text-sm text-gray-500"> {{ page }} / {{ totalPages }} </span>
<button
class="ml-3 relative inline-flex items-center px-4 py-2 border border-gray-300 text-sm font-medium rounded-md text-gray-700 bg-white hover:bg-gray-50 cursor-pointer"
:disabled="!hasNext"
@click="next"
>
<IconArrowRight />
</span>
</button>
</div>
<div class="hidden sm:flex-1 sm:flex sm:items-center items-center gap-2">
<nav
Expand All @@ -95,36 +92,38 @@ const {
>
<button
class="relative h-8 outline-none inline-flex items-center px-2 py-1.5 rounded-l-base border border-gray-300 bg-white text-sm font-medium text-gray-500 hover:bg-gray-50 cursor-pointer disabled:cursor-not-allowed"
:disabled="isFirstPage"
@click="prev"
:disabled="!hasPrevious"
@click="previous"
>
<IconArrowLeft />
</button>
<button
class="relative h-8 outline-none inline-flex items-center px-2 py-1.5 rounded-r-base border border-gray-300 bg-white text-sm font-medium text-gray-500 hover:bg-gray-50 cursor-pointer disabled:cursor-not-allowed"
:disabled="isLastPage"
:disabled="!hasNext"
@click="next"
>
<IconArrowRight />
</button>
</nav>
<div class="inline-flex items-center gap-2">
<select
v-model="currentPage"
:disabled="pageCount === 0"
:value="page"
:disabled="totalPages === 0"
class="h-8 border outline-none rounded-base px-2 text-gray-800 text-sm border-gray-300"
@change="onPageChange"
>
<option v-if="pageCount === 0" :value="0">0 / 0</option>
<option v-for="i in pageCount" :key="i" :value="i">
{{ i }} / {{ pageCount }}
<option v-if="totalPages === 0" :value="0">0 / 0</option>
<option v-for="i in totalPages" :key="i" :value="i">
{{ i }} / {{ totalPages }}
</option>
</select>
<span class="text-sm text-gray-500">{{ pageLabel }}</span>
</div>
<div class="inline-flex items-center gap-2">
<select
v-model="currentPageSize"
:value="size"
class="h-8 border outline-none rounded-base px-2 text-gray-800 text-sm border-gray-300"
@change="onSizeChange"
>
<option
v-for="(sizeOption, index) in sizeOptions"
Expand Down
86 changes: 55 additions & 31 deletions console/pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit bb0a5f1

Please sign in to comment.