diff --git a/console/src/components/permission/HasPermission.vue b/console/src/components/permission/HasPermission.vue
new file mode 100644
index 0000000000..ee871618be
--- /dev/null
+++ b/console/src/components/permission/HasPermission.vue
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/console/src/modules/contents/_components/ContributorList.vue b/console/src/modules/contents/_components/ContributorList.vue
new file mode 100644
index 0000000000..67dd027691
--- /dev/null
+++ b/console/src/modules/contents/_components/ContributorList.vue
@@ -0,0 +1,39 @@
+
+
+
+
+
diff --git a/console/src/modules/contents/attachments/AttachmentList.vue b/console/src/modules/contents/attachments/AttachmentList.vue
index 0295226d8d..47f2a5f00a 100644
--- a/console/src/modules/contents/attachments/AttachmentList.vue
+++ b/console/src/modules/contents/attachments/AttachmentList.vue
@@ -356,10 +356,12 @@ onMounted(() => {
}) || []),
]"
/>
-
+
+
+
{
},
}"
class="text-xs text-gray-500"
+ :class="{
+ 'pointer-events-none': !currentUserHasPermission([
+ 'system:users:view',
+ ]),
+ }"
>
{{ attachment.spec.ownerName }}
diff --git a/console/src/modules/contents/comments/CommentList.vue b/console/src/modules/contents/comments/CommentList.vue
index 37797c0426..80a2301108 100644
--- a/console/src/modules/contents/comments/CommentList.vue
+++ b/console/src/modules/contents/comments/CommentList.vue
@@ -283,10 +283,12 @@ const handleApproveInBatch = async () => {
},
]"
/>
-
+
+
+
-
-
-
+
diff --git a/console/src/modules/contents/pages/SinglePageList.vue b/console/src/modules/contents/pages/SinglePageList.vue
index 2566f77f0d..80be4af5ec 100644
--- a/console/src/modules/contents/pages/SinglePageList.vue
+++ b/console/src/modules/contents/pages/SinglePageList.vue
@@ -379,10 +379,12 @@ watch(selectedPageNames, (newValue) => {
},
]"
/>
-
+
+
+
{
-
-
-
+
diff --git a/console/src/modules/contents/posts/DeletedPostList.vue b/console/src/modules/contents/posts/DeletedPostList.vue
index 5aa5a04321..c6e07737ff 100644
--- a/console/src/modules/contents/posts/DeletedPostList.vue
+++ b/console/src/modules/contents/posts/DeletedPostList.vue
@@ -10,7 +10,6 @@ import {
VPageHeader,
VPagination,
VSpace,
- VAvatar,
VStatusDot,
VEntity,
VEntityField,
@@ -27,6 +26,7 @@ import { usePermission } from "@/utils/permission";
import cloneDeep from "lodash.clonedeep";
import { useQuery } from "@tanstack/vue-query";
import { useI18n } from "vue-i18n";
+import ContributorList from "../_components/ContributorList.vue";
const { currentUserHasPermission } = usePermission();
const { t } = useI18n();
@@ -353,25 +353,7 @@ watch(
-
-
-
+
diff --git a/console/src/modules/contents/posts/PostList.vue b/console/src/modules/contents/posts/PostList.vue
index 9e1285e119..0e622d0994 100644
--- a/console/src/modules/contents/posts/PostList.vue
+++ b/console/src/modules/contents/posts/PostList.vue
@@ -393,10 +393,12 @@ watch(selectedPostNames, (newValue) => {
v-model="selectedTag"
:label="$t('core.post.filters.tag.label')"
/>
-
+
+
+
-import { VAvatar, VEntityField } from "@halo-dev/components";
+import { VEntityField } from "@halo-dev/components";
import type { ListedPost } from "@halo-dev/api-client";
+import ContributorList from "@/modules/contents/_components/ContributorList.vue";
withDefaults(
defineProps<{
@@ -13,23 +14,7 @@ withDefaults(
-
-
-
+
diff --git a/console/src/setup/setupComponents.ts b/console/src/setup/setupComponents.ts
index f36ef47966..c00e3d866a 100644
--- a/console/src/setup/setupComponents.ts
+++ b/console/src/setup/setupComponents.ts
@@ -11,6 +11,7 @@ import FilterCleanButton from "@/components/filter/FilterCleanButton.vue";
import SearchInput from "@/components/input/SearchInput.vue";
import AnnotationsForm from "@/components/form/AnnotationsForm.vue";
import AttachmentFileTypeIcon from "@/components/icon/AttachmentFileTypeIcon.vue";
+import HasPermission from "@/components/permission/HasPermission.vue";
export function setupComponents(app: App) {
app.use(VueGridLayout);
@@ -37,4 +38,5 @@ export function setupComponents(app: App) {
app.component("SearchInput", SearchInput);
app.component("AnnotationsForm", AnnotationsForm);
app.component("AttachmentFileTypeIcon", AttachmentFileTypeIcon);
+ app.component("HasPermission", HasPermission);
}