halo/ui/console-src/modules/dashboard/widgets/QuickLinkWidget.vue

211 lines
5.4 KiB
Vue

<script lang="ts" setup>
import ThemePreviewModal from "@console/modules/interface/themes/components/preview/ThemePreviewModal.vue";
import { consoleApiClient } from "@halo-dev/api-client";
import {
Dialog,
IconAccountCircleLine,
IconArrowRight,
IconBookRead,
IconFolder,
IconPages,
IconPalette,
IconPlug,
IconSearch,
IconUserSettings,
IconWindowLine,
Toast,
VCard,
} from "@halo-dev/components";
import { OverlayScrollbarsComponent } from "overlayscrollbars-vue";
import { markRaw, ref, type Component } from "vue";
import { useI18n } from "vue-i18n";
import { useRouter } from "vue-router";
interface Action {
icon: Component;
title: string;
action: () => void;
permissions?: string[];
}
const router = useRouter();
const themePreviewVisible = ref(false);
const { t } = useI18n();
const actions: Action[] = [
{
icon: markRaw(IconAccountCircleLine),
title: t(
"core.dashboard.widgets.presets.quicklink.actions.user_center.title"
),
action: () => {
window.location.href = "/uc/profile";
},
},
{
icon: markRaw(IconWindowLine),
title: t(
"core.dashboard.widgets.presets.quicklink.actions.view_site.title"
),
action: () => {
themePreviewVisible.value = true;
},
permissions: ["system:themes:view"],
},
{
icon: markRaw(IconBookRead),
title: t("core.dashboard.widgets.presets.quicklink.actions.new_post.title"),
action: () => {
router.push({
name: "PostEditor",
});
},
permissions: ["system:posts:manage"],
},
{
icon: markRaw(IconPages),
title: t("core.dashboard.widgets.presets.quicklink.actions.new_page.title"),
action: () => {
router.push({
name: "SinglePageEditor",
});
},
permissions: ["system:singlepages:manage"],
},
{
icon: markRaw(IconFolder),
title: t(
"core.dashboard.widgets.presets.quicklink.actions.upload_attachment.title"
),
action: () => {
router.push({
name: "Attachments",
query: {
action: "upload",
},
});
},
permissions: ["system:attachments:manage"],
},
{
icon: markRaw(IconPalette),
title: t(
"core.dashboard.widgets.presets.quicklink.actions.theme_manage.title"
),
action: () => {
router.push({
name: "ThemeDetail",
});
},
permissions: ["system:themes:view"],
},
{
icon: markRaw(IconPlug),
title: t(
"core.dashboard.widgets.presets.quicklink.actions.plugin_manage.title"
),
action: () => {
router.push({
name: "Plugins",
});
},
permissions: ["system:plugins:view"],
},
{
icon: markRaw(IconUserSettings),
title: t("core.dashboard.widgets.presets.quicklink.actions.new_user.title"),
action: () => {
router.push({
name: "Users",
query: {
action: "create",
},
});
},
permissions: ["system:users:manage"],
},
{
icon: markRaw(IconSearch),
title: t(
"core.dashboard.widgets.presets.quicklink.actions.refresh_search_engine.title"
),
action: () => {
Dialog.warning({
title: t(
"core.dashboard.widgets.presets.quicklink.actions.refresh_search_engine.dialog_title"
),
description: t(
"core.dashboard.widgets.presets.quicklink.actions.refresh_search_engine.dialog_content"
),
confirmText: t("core.common.buttons.confirm"),
cancelText: t("core.common.buttons.cancel"),
onConfirm: async () => {
await consoleApiClient.content.indices.buildPostIndices();
Toast.success(
t(
"core.dashboard.widgets.presets.quicklink.actions.refresh_search_engine.success_message"
)
);
},
});
},
permissions: ["system:posts:manage"],
},
];
</script>
<template>
<VCard
:body-class="['h-full', '@container', '!p-0', '!overflow-auto']"
class="h-full"
:title="$t('core.dashboard.widgets.presets.quicklink.title')"
>
<OverlayScrollbarsComponent
element="div"
:options="{ scrollbars: { autoHide: 'scroll' } }"
class="h-full w-full"
style="padding: 12px 16px"
defer
>
<div
class="grid grid-cols-1 gap-2 overflow-hidden @sm:grid-cols-2 @md:grid-cols-3"
>
<div
v-for="(action, index) in actions"
:key="index"
v-permission="action.permissions"
class="group relative cursor-pointer rounded-lg bg-gray-50 p-4 transition-all hover:bg-gray-100"
@click="action.action"
>
<div>
<span
class="inline-flex rounded-lg bg-teal-50 p-3 text-teal-700 ring-4 ring-white"
>
<component :is="action.icon"></component>
</span>
</div>
<div class="mt-8">
<h3 class="text-sm font-semibold">
{{ action.title }}
</h3>
</div>
<span
aria-hidden="true"
class="pointer-events-none absolute right-6 top-6 text-gray-300 transition-all group-hover:translate-x-1 group-hover:text-gray-400"
>
<IconArrowRight />
</span>
</div>
</div>
</OverlayScrollbarsComponent>
</VCard>
<ThemePreviewModal
v-if="themePreviewVisible"
:title="
$t('core.dashboard.widgets.presets.quicklink.actions.view_site.title')
"
@close="themePreviewVisible = false"
/>
</template>