From 6b70296956a78077e12a68948edfdb41a45d7fce Mon Sep 17 00:00:00 2001 From: Ryan Wang Date: Thu, 20 Jul 2023 16:10:18 +0800 Subject: [PATCH] refactor: code structure of the post data list (#4219) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #### What type of PR is this? /area console /kind improvement /milestone 2.8.x #### What this PR does / why we need it: 重构 Console 端文章管理列表的代码结构,封装列表项为单个组件。 #### Special notes for your reviewer: 需要测试文章管理的功能是否正常。 #### Does this PR introduce a user-facing change? ```release-note None ``` --- .../src/modules/contents/posts/PostList.vue | 278 +---------------- .../posts/components/PostListItem.vue | 295 ++++++++++++++++++ 2 files changed, 306 insertions(+), 267 deletions(-) create mode 100644 console/src/modules/contents/posts/components/PostListItem.vue diff --git a/console/src/modules/contents/posts/PostList.vue b/console/src/modules/contents/posts/PostList.vue index af6c599f3..29ef958e2 100644 --- a/console/src/modules/contents/posts/PostList.vue +++ b/console/src/modules/contents/posts/PostList.vue @@ -4,10 +4,7 @@ import { IconArrowLeft, IconArrowRight, IconBookRead, - IconEye, - IconEyeOff, IconRefreshLine, - IconExternalLinkLine, Dialog, VButton, VCard, @@ -15,31 +12,24 @@ import { VPageHeader, VPagination, VSpace, - VAvatar, - VStatusDot, - VEntity, - VEntityField, VLoading, Toast, - VDropdownItem, - VDropdownDivider, } from "@halo-dev/components"; import PostSettingModal from "./components/PostSettingModal.vue"; -import PostTag from "../posts/tags/components/PostTag.vue"; import { computed, ref, watch } from "vue"; import type { Post, ListedPost } from "@halo-dev/api-client"; import { apiClient } from "@/utils/api-client"; -import { formatDatetime } from "@/utils/date"; -import { usePermission } from "@/utils/permission"; import { postLabels } from "@/constants/labels"; -import { useMutation, useQuery } from "@tanstack/vue-query"; +import { useQuery } from "@tanstack/vue-query"; import { useI18n } from "vue-i18n"; import { useRouteQuery } from "@vueuse/router"; import UserFilterDropdown from "@/components/filter/UserFilterDropdown.vue"; import CategoryFilterDropdown from "@/components/filter/CategoryFilterDropdown.vue"; import TagFilterDropdown from "@/components/filter/TagFilterDropdown.vue"; +import PostListItem from "./components/PostListItem.vue"; +import { provide } from "vue"; +import type { Ref } from "vue"; -const { currentUserHasPermission } = usePermission(); const { t } = useI18n(); const settingModal = ref(false); @@ -47,6 +37,8 @@ const selectedPost = ref(); const checkedAll = ref(false); const selectedPostNames = ref([]); +provide>("selectedPostNames", selectedPostNames); + // Filters const page = useRouteQuery("page", 1, { transform: Number, @@ -241,21 +233,6 @@ const checkSelection = (post: Post) => { ); }; -const getPublishStatus = (post: Post) => { - const { labels } = post.metadata; - return labels?.[postLabels.PUBLISHED] === "true" - ? t("core.post.filters.status.items.published") - : t("core.post.filters.status.items.draft"); -}; - -const isPublishing = (post: Post) => { - const { spec, status, metadata } = post; - return ( - (spec.publish && metadata.labels?.[postLabels.PUBLISHED] !== "true") || - (spec.releaseSnapshot === spec.headSnapshot && status?.inProgress) - ); -}; - const handleCheckAllChange = (e: Event) => { const { checked } = e.target as HTMLInputElement; @@ -269,24 +246,6 @@ const handleCheckAllChange = (e: Event) => { } }; -const handleDelete = async (post: Post) => { - Dialog.warning({ - title: t("core.post.operations.delete.title"), - description: t("core.post.operations.delete.description"), - confirmType: "danger", - confirmText: t("core.common.buttons.confirm"), - cancelText: t("core.common.buttons.cancel"), - onConfirm: async () => { - await apiClient.post.recyclePost({ - name: post.metadata.name, - }); - await refetch(); - - Toast.success(t("core.common.toast.delete_success")); - }, - }); -}; - const handleDeleteInBatch = async () => { Dialog.warning({ title: t("core.post.operations.delete_in_batch.title"), @@ -313,40 +272,6 @@ const handleDeleteInBatch = async () => { watch(selectedPostNames, (newValue) => { checkedAll.value = newValue.length === posts.value?.length; }); - -const { mutate: changeVisibleMutation } = useMutation({ - mutationFn: async (post: Post) => { - const { data } = - await apiClient.extension.post.getcontentHaloRunV1alpha1Post({ - name: post.metadata.name, - }); - data.spec.visible = data.spec.visible === "PRIVATE" ? "PUBLIC" : "PRIVATE"; - await apiClient.extension.post.updatecontentHaloRunV1alpha1Post( - { - name: post.metadata.name, - post: data, - }, - { - mute: true, - } - ); - await refetch(); - }, - retry: 3, - onSuccess: () => { - Toast.success(t("core.common.toast.operation_success")); - }, - onError: () => { - Toast.error(t("core.common.toast.operation_failed")); - }, -}); - -const getExternalUrl = (post: Post) => { - if (post.metadata.labels?.[postLabels.PUBLISHED] === "true") { - return post.status?.permalink; - } - return `/preview/posts/${post.metadata.name}`; -};