fix: missing ui permission condition about users (#4619)

Signed-off-by: Ryan Wang <i@ryanc.cc>
pull/4657/head
Ryan Wang 2023-09-22 16:11:53 +08:00 committed by GitHub
parent d3e296d782
commit f953201307
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 95 additions and 93 deletions

View File

@ -0,0 +1,16 @@
<script lang="ts" setup>
import { usePermission } from "@/utils/permission";
withDefaults(
defineProps<{
permissions: string[];
}>(),
{}
);
const { currentUserHasPermission } = usePermission();
</script>
<template>
<slot v-if="currentUserHasPermission(permissions)" />
</template>

View File

@ -0,0 +1,39 @@
<script lang="ts" setup>
import { usePermission } from "@/utils/permission";
import type { Contributor } from "@halo-dev/api-client";
import { VAvatar } from "@halo-dev/components";
import { useRouter } from "vue-router";
withDefaults(
defineProps<{
contributors: Contributor[];
}>(),
{}
);
const router = useRouter();
const { currentUserHasPermission } = usePermission();
function handleRouteToUserDetail(contributor: Contributor) {
if (!currentUserHasPermission(["system:users:view"])) {
return;
}
router.push({
name: "UserDetail",
params: { name: contributor.name },
});
}
</script>
<template>
<VAvatar
v-for="(contributor, contributorIndex) in contributors"
:key="contributorIndex"
v-tooltip="contributor.displayName"
size="xs"
:src="contributor.avatar"
:alt="contributor.displayName"
circle
@click="handleRouteToUserDetail(contributor)"
></VAvatar>
</template>

View File

@ -356,10 +356,12 @@ onMounted(() => {
}) || []),
]"
/>
<UserFilterDropdown
v-model="selectedUser"
:label="$t('core.attachment.filters.owner.label')"
/>
<HasPermission :permissions="['system:users:view']">
<UserFilterDropdown
v-model="selectedUser"
:label="$t('core.attachment.filters.owner.label')"
/>
</HasPermission>
<FilterDropdown
v-model="selectedSort"
:label="$t('core.common.filters.labels.sort')"
@ -610,6 +612,11 @@ onMounted(() => {
},
}"
class="text-xs text-gray-500"
:class="{
'pointer-events-none': !currentUserHasPermission([
'system:users:view',
]),
}"
>
{{ attachment.spec.ownerName }}
</RouterLink>

View File

@ -283,10 +283,12 @@ const handleApproveInBatch = async () => {
},
]"
/>
<UserFilterDropdown
v-model="selectedUser"
:label="$t('core.comment.filters.owner.label')"
/>
<HasPermission :permissions="['system:users:view']">
<UserFilterDropdown
v-model="selectedUser"
:label="$t('core.comment.filters.owner.label')"
/>
</HasPermission>
<FilterDropdown
v-model="selectedSort"
:label="$t('core.common.filters.labels.sort')"

View File

@ -9,7 +9,6 @@ import {
VSpace,
Dialog,
VEmpty,
VAvatar,
VEntity,
VEntityField,
VPageHeader,
@ -22,11 +21,11 @@ import { ref, watch } from "vue";
import type { ListedSinglePage, SinglePage } from "@halo-dev/api-client";
import { apiClient } from "@/utils/api-client";
import { formatDatetime } from "@/utils/date";
import { RouterLink } from "vue-router";
import cloneDeep from "lodash.clonedeep";
import { usePermission } from "@/utils/permission";
import { useQuery } from "@tanstack/vue-query";
import { useI18n } from "vue-i18n";
import ContributorList from "../_components/ContributorList.vue";
const { currentUserHasPermission } = usePermission();
const { t } = useI18n();
@ -338,25 +337,7 @@ watch(
<template #end>
<VEntityField>
<template #description>
<RouterLink
v-for="(
contributor, contributorIndex
) in singlePage.contributors"
:key="contributorIndex"
:to="{
name: 'UserDetail',
params: { name: contributor.name },
}"
class="flex items-center"
>
<VAvatar
v-tooltip="contributor.displayName"
size="xs"
:src="contributor.avatar"
:alt="contributor.displayName"
circle
></VAvatar>
</RouterLink>
<ContributorList :contributors="singlePage.contributors" />
</template>
</VEntityField>
<VEntityField v-if="!singlePage?.page?.spec.deleted">

View File

@ -379,10 +379,12 @@ watch(selectedPageNames, (newValue) => {
},
]"
/>
<UserFilterDropdown
v-model="selectedContributor"
:label="$t('core.page.filters.author.label')"
/>
<HasPermission :permissions="['system:users:view']">
<UserFilterDropdown
v-model="selectedContributor"
:label="$t('core.page.filters.author.label')"
/>
</HasPermission>
<FilterDropdown
v-model="selectedSort"
:label="$t('core.common.filters.labels.sort')"

View File

@ -5,7 +5,6 @@ import {
IconExternalLinkLine,
VSpace,
Dialog,
VAvatar,
VStatusDot,
VEntity,
VEntityField,
@ -25,6 +24,7 @@ import { useMutation, useQueryClient } from "@tanstack/vue-query";
import { useI18n } from "vue-i18n";
import { inject } from "vue";
import type { Ref } from "vue";
import ContributorList from "../../_components/ContributorList.vue";
const { currentUserHasPermission } = usePermission();
const { t } = useI18n();
@ -189,23 +189,7 @@ const handleDelete = async () => {
<template #end>
<VEntityField>
<template #description>
<RouterLink
v-for="(contributor, contributorIndex) in singlePage.contributors"
:key="contributorIndex"
:to="{
name: 'UserDetail',
params: { name: contributor.name },
}"
class="flex items-center"
>
<VAvatar
v-tooltip="contributor.displayName"
size="xs"
:src="contributor.avatar"
:alt="contributor.displayName"
circle
></VAvatar>
</RouterLink>
<ContributorList :contributors="singlePage.contributors" />
</template>
</VEntityField>
<VEntityField :description="publishStatus">

View File

@ -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(
<template #end>
<VEntityField>
<template #description>
<RouterLink
v-for="(
contributor, contributorIndex
) in post.contributors"
:key="contributorIndex"
:to="{
name: 'UserDetail',
params: { name: contributor.name },
}"
class="flex items-center"
>
<VAvatar
v-tooltip="contributor.displayName"
size="xs"
:src="contributor.avatar"
:alt="contributor.displayName"
circle
></VAvatar>
</RouterLink>
<ContributorList :contributors="post.contributors" />
</template>
</VEntityField>
<VEntityField v-if="!post?.post?.spec.deleted">

View File

@ -393,10 +393,12 @@ watch(selectedPostNames, (newValue) => {
v-model="selectedTag"
:label="$t('core.post.filters.tag.label')"
/>
<UserFilterDropdown
v-model="selectedContributor"
:label="$t('core.post.filters.author.label')"
/>
<HasPermission :permissions="['system:users:view']">
<UserFilterDropdown
v-model="selectedContributor"
:label="$t('core.post.filters.author.label')"
/>
</HasPermission>
<FilterDropdown
v-model="selectedSort"
:label="$t('core.common.filters.labels.sort')"

View File

@ -1,6 +1,7 @@
<script lang="ts" setup>
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(
<template>
<VEntityField>
<template #description>
<RouterLink
v-for="(contributor, contributorIndex) in post.contributors"
:key="contributorIndex"
:to="{
name: 'UserDetail',
params: { name: contributor.name },
}"
class="flex items-center"
>
<VAvatar
v-tooltip="contributor.displayName"
size="xs"
:src="contributor.avatar"
:alt="contributor.displayName"
circle
></VAvatar>
</RouterLink>
<ContributorList :contributors="post.contributors" />
</template>
</VEntityField>
</template>

View File

@ -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);
}