mirror of https://github.com/halo-dev/halo
Merge pull request #4864 from halo-dev/feature-user-center
Support user center projectpull/4859/head^2
commit
796ffac55f
|
@ -0,0 +1,7 @@
|
||||||
|
<script lang="ts" setup>
|
||||||
|
import BaseApp from "@/components/base-app/BaseApp.vue";
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<BaseApp />
|
||||||
|
</template>
|
|
@ -2,7 +2,7 @@
|
||||||
// types
|
// types
|
||||||
import { computed, watch, type ComputedRef, type Ref } from "vue";
|
import { computed, watch, type ComputedRef, type Ref } from "vue";
|
||||||
import { ref } from "vue";
|
import { ref } from "vue";
|
||||||
import { apiClient } from "../utils/api-client";
|
import { apiClient } from "@/utils/api-client";
|
||||||
|
|
||||||
// libs
|
// libs
|
||||||
import cloneDeep from "lodash.clonedeep";
|
import cloneDeep from "lodash.clonedeep";
|
|
@ -3,29 +3,20 @@ import {
|
||||||
IconMore,
|
IconMore,
|
||||||
IconSearch,
|
IconSearch,
|
||||||
IconUserSettings,
|
IconUserSettings,
|
||||||
|
IconLogoutCircleRLine,
|
||||||
VTag,
|
VTag,
|
||||||
VAvatar,
|
VAvatar,
|
||||||
Dialog,
|
Dialog,
|
||||||
VDropdown,
|
IconAccountCircleLine,
|
||||||
VDropdownItem,
|
|
||||||
} from "@halo-dev/components";
|
} from "@halo-dev/components";
|
||||||
import { RoutesMenu } from "@/components/menu/RoutesMenu";
|
import { RoutesMenu } from "@/components/menu/RoutesMenu";
|
||||||
import type { MenuGroupType, MenuItemType } from "@halo-dev/console-shared";
|
|
||||||
import IconLogo from "~icons/core/logo?width=5rem&height=2rem";
|
import IconLogo from "~icons/core/logo?width=5rem&height=2rem";
|
||||||
import {
|
import { RouterView, useRoute, useRouter } from "vue-router";
|
||||||
RouterView,
|
import { onMounted, reactive, ref } from "vue";
|
||||||
useRoute,
|
|
||||||
useRouter,
|
|
||||||
type RouteRecordRaw,
|
|
||||||
} from "vue-router";
|
|
||||||
import { onMounted, onUnmounted, reactive, ref } from "vue";
|
|
||||||
import axios from "axios";
|
import axios from "axios";
|
||||||
import GlobalSearchModal from "@/components/global-search/GlobalSearchModal.vue";
|
import GlobalSearchModal from "@/components/global-search/GlobalSearchModal.vue";
|
||||||
import LoginModal from "@/components/login/LoginModal.vue";
|
import LoginModal from "@/components/login/LoginModal.vue";
|
||||||
import { coreMenuGroups } from "@/router/routes.config";
|
import { coreMenuGroups } from "@console/router/constant";
|
||||||
import sortBy from "lodash.sortby";
|
|
||||||
import { useRoleStore } from "@/stores/role";
|
|
||||||
import { hasPermission } from "@/utils/permission";
|
|
||||||
import { useUserStore } from "@/stores/user";
|
import { useUserStore } from "@/stores/user";
|
||||||
import { rbacAnnotations } from "@/constants/annotations";
|
import { rbacAnnotations } from "@/constants/annotations";
|
||||||
import { defineStore, storeToRefs } from "pinia";
|
import { defineStore, storeToRefs } from "pinia";
|
||||||
|
@ -35,6 +26,8 @@ import {
|
||||||
type UseOverlayScrollbarsParams,
|
type UseOverlayScrollbarsParams,
|
||||||
} from "overlayscrollbars-vue";
|
} from "overlayscrollbars-vue";
|
||||||
import { isMac } from "@/utils/device";
|
import { isMac } from "@/utils/device";
|
||||||
|
import { useEventListener } from "@vueuse/core";
|
||||||
|
import { useRouteMenuGenerator } from "@/composables/use-route-menu-generator";
|
||||||
|
|
||||||
const route = useRoute();
|
const route = useRoute();
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
|
@ -70,122 +63,15 @@ const handleLogout = () => {
|
||||||
|
|
||||||
// Global Search
|
// Global Search
|
||||||
const globalSearchVisible = ref(false);
|
const globalSearchVisible = ref(false);
|
||||||
|
useEventListener(document, "keydown", (e: KeyboardEvent) => {
|
||||||
const handleGlobalSearchKeybinding = (e: KeyboardEvent) => {
|
|
||||||
const { key, ctrlKey, metaKey } = e;
|
const { key, ctrlKey, metaKey } = e;
|
||||||
if (key === "k" && ((ctrlKey && !isMac) || metaKey)) {
|
if (key === "k" && ((ctrlKey && !isMac) || metaKey)) {
|
||||||
globalSearchVisible.value = true;
|
globalSearchVisible.value = true;
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
onMounted(() => {
|
|
||||||
document.addEventListener("keydown", handleGlobalSearchKeybinding);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
onUnmounted(() => {
|
const { menus, minimenus } = useRouteMenuGenerator(coreMenuGroups);
|
||||||
document.removeEventListener("keydown", handleGlobalSearchKeybinding);
|
|
||||||
});
|
|
||||||
|
|
||||||
// Generate menus by routes
|
|
||||||
const menus = ref<MenuGroupType[]>([] as MenuGroupType[]);
|
|
||||||
const minimenus = ref<MenuItemType[]>([] as MenuItemType[]);
|
|
||||||
|
|
||||||
const roleStore = useRoleStore();
|
|
||||||
const { uiPermissions } = roleStore.permissions;
|
|
||||||
|
|
||||||
const generateMenus = () => {
|
|
||||||
// sort by menu.priority and meta.core
|
|
||||||
const currentRoutes = sortBy(
|
|
||||||
router.getRoutes().filter((route) => {
|
|
||||||
const { meta } = route;
|
|
||||||
if (!meta?.menu) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (meta.permissions) {
|
|
||||||
return hasPermission(uiPermissions, meta.permissions as string[], true);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}),
|
|
||||||
[
|
|
||||||
(route: RouteRecordRaw) => !route.meta?.core,
|
|
||||||
(route: RouteRecordRaw) => route.meta?.menu?.priority || 0,
|
|
||||||
]
|
|
||||||
);
|
|
||||||
|
|
||||||
// group by menu.group
|
|
||||||
menus.value = currentRoutes.reduce((acc, route) => {
|
|
||||||
const { menu } = route.meta;
|
|
||||||
if (!menu) {
|
|
||||||
return acc;
|
|
||||||
}
|
|
||||||
const group = acc.find((item) => item.id === menu.group);
|
|
||||||
const childRoute = route.children[0];
|
|
||||||
const childMetaMenu = childRoute?.meta?.menu;
|
|
||||||
|
|
||||||
// only support one level
|
|
||||||
const menuChildren = childMetaMenu
|
|
||||||
? [
|
|
||||||
{
|
|
||||||
name: childMetaMenu.name,
|
|
||||||
path: childRoute.path,
|
|
||||||
icon: childMetaMenu.icon,
|
|
||||||
},
|
|
||||||
]
|
|
||||||
: undefined;
|
|
||||||
if (group) {
|
|
||||||
group.items?.push({
|
|
||||||
name: menu.name,
|
|
||||||
path: route.path,
|
|
||||||
icon: menu.icon,
|
|
||||||
mobile: menu.mobile,
|
|
||||||
children: menuChildren,
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
const menuGroup = coreMenuGroups.find((item) => item.id === menu.group);
|
|
||||||
let name = "";
|
|
||||||
if (!menuGroup) {
|
|
||||||
name = menu.group;
|
|
||||||
} else if (menuGroup.name) {
|
|
||||||
name = menuGroup.name;
|
|
||||||
}
|
|
||||||
acc.push({
|
|
||||||
id: menuGroup?.id || menu.group,
|
|
||||||
name: name,
|
|
||||||
priority: menuGroup?.priority || 0,
|
|
||||||
items: [
|
|
||||||
{
|
|
||||||
name: menu.name,
|
|
||||||
path: route.path,
|
|
||||||
icon: menu.icon,
|
|
||||||
mobile: menu.mobile,
|
|
||||||
children: menuChildren,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return acc;
|
|
||||||
}, [] as MenuGroupType[]);
|
|
||||||
|
|
||||||
// sort by menu.priority
|
|
||||||
menus.value = sortBy(menus.value, [
|
|
||||||
(menu: MenuGroupType) => {
|
|
||||||
return coreMenuGroups.findIndex((item) => item.id === menu.id) < 0;
|
|
||||||
},
|
|
||||||
(menu: MenuGroupType) => menu.priority || 0,
|
|
||||||
]);
|
|
||||||
|
|
||||||
minimenus.value = menus.value
|
|
||||||
.reduce((acc, group) => {
|
|
||||||
if (group?.items) {
|
|
||||||
acc.push(...group.items);
|
|
||||||
}
|
|
||||||
return acc;
|
|
||||||
}, [] as MenuItemType[])
|
|
||||||
.filter((item) => item.mobile);
|
|
||||||
};
|
|
||||||
|
|
||||||
onMounted(generateMenus);
|
|
||||||
|
|
||||||
// aside scroll
|
// aside scroll
|
||||||
const navbarScroller = ref();
|
const navbarScroller = ref();
|
||||||
|
@ -230,7 +116,7 @@ onMounted(() => {
|
||||||
<aside
|
<aside
|
||||||
class="navbar fixed hidden h-full overflow-y-auto md:flex md:flex-col"
|
class="navbar fixed hidden h-full overflow-y-auto md:flex md:flex-col"
|
||||||
>
|
>
|
||||||
<div class="logo flex justify-center pb-7 pt-5">
|
<div class="logo flex justify-center pb-5 pt-5">
|
||||||
<a
|
<a
|
||||||
href="/"
|
href="/"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
|
@ -266,12 +152,15 @@ onMounted(() => {
|
||||||
<VAvatar
|
<VAvatar
|
||||||
:src="currentUser?.spec.avatar"
|
:src="currentUser?.spec.avatar"
|
||||||
:alt="currentUser?.spec.displayName"
|
:alt="currentUser?.spec.displayName"
|
||||||
size="md"
|
size="sm"
|
||||||
circle
|
circle
|
||||||
></VAvatar>
|
></VAvatar>
|
||||||
</div>
|
</div>
|
||||||
<div class="profile-name">
|
<div class="profile-name">
|
||||||
<div class="flex text-sm font-medium">
|
<div
|
||||||
|
class="flex text-sm font-medium"
|
||||||
|
:title="currentUser?.spec.displayName"
|
||||||
|
>
|
||||||
{{ currentUser?.spec.displayName }}
|
{{ currentUser?.spec.displayName }}
|
||||||
</div>
|
</div>
|
||||||
<div v-if="currentRoles?.[0]" class="flex">
|
<div v-if="currentRoles?.[0]" class="flex">
|
||||||
|
@ -287,35 +176,26 @@ onMounted(() => {
|
||||||
</VTag>
|
</VTag>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<VDropdown
|
|
||||||
class="profile-control cursor-pointer rounded p-1 transition-all hover:bg-gray-100"
|
<div class="flex items-center gap-1">
|
||||||
>
|
<a
|
||||||
<IconMore />
|
v-tooltip="'个人中心'"
|
||||||
<template #popper>
|
class="group inline-block cursor-pointer rounded-full p-1.5 transition-all hover:bg-gray-100"
|
||||||
<VDropdownItem
|
href="/uc"
|
||||||
@click="
|
>
|
||||||
$router.push({
|
<IconAccountCircleLine
|
||||||
name: 'UserDetail',
|
class="h-5 w-5 text-gray-600 group-hover:text-gray-900"
|
||||||
params: { name: '-' },
|
/>
|
||||||
})
|
</a>
|
||||||
"
|
<div
|
||||||
>
|
class="group inline-block cursor-pointer rounded-full p-1.5 transition-all hover:bg-gray-100"
|
||||||
{{ $t("core.sidebar.operations.profile.button") }}
|
@click="handleLogout"
|
||||||
</VDropdownItem>
|
>
|
||||||
<VDropdownItem
|
<IconLogoutCircleRLine
|
||||||
@click="
|
class="h-5 w-5 text-gray-600 group-hover:text-gray-900"
|
||||||
$router.push({
|
/>
|
||||||
name: 'UserNotifications',
|
</div>
|
||||||
})
|
</div>
|
||||||
"
|
|
||||||
>
|
|
||||||
{{ $t("core.sidebar.operations.notifications.button") }}
|
|
||||||
</VDropdownItem>
|
|
||||||
<VDropdownItem @click="handleLogout">
|
|
||||||
{{ $t("core.sidebar.operations.logout.button") }}
|
|
||||||
</VDropdownItem>
|
|
||||||
</template>
|
|
||||||
</VDropdown>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</aside>
|
</aside>
|
||||||
|
@ -438,11 +318,8 @@ onMounted(() => {
|
||||||
|
|
||||||
.profile-name {
|
.profile-name {
|
||||||
@apply flex-1
|
@apply flex-1
|
||||||
self-center;
|
self-center
|
||||||
}
|
overflow-hidden;
|
||||||
|
|
||||||
.profile-control {
|
|
||||||
@apply self-center;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -5,18 +5,21 @@ import App from "./App.vue";
|
||||||
import router from "./router";
|
import router from "./router";
|
||||||
import { apiClient } from "@/utils/api-client";
|
import { apiClient } from "@/utils/api-client";
|
||||||
// setup
|
// setup
|
||||||
import "./setup/setupStyles";
|
import "@/setup/setupStyles";
|
||||||
import { setupComponents } from "./setup/setupComponents";
|
import { setupComponents } from "@/setup/setupComponents";
|
||||||
import { setupI18n, i18n, getBrowserLanguage } from "./locales";
|
import { setupI18n, i18n, getBrowserLanguage } from "@/locales";
|
||||||
// core modules
|
// core modules
|
||||||
import { hasPermission } from "@/utils/permission";
|
import { hasPermission } from "@/utils/permission";
|
||||||
import { useRoleStore } from "@/stores/role";
|
import { useRoleStore } from "@/stores/role";
|
||||||
import { useThemeStore } from "./stores/theme";
|
import { useThemeStore } from "@console/stores/theme";
|
||||||
import { useUserStore } from "./stores/user";
|
import { useUserStore } from "@/stores/user";
|
||||||
import { useSystemConfigMapStore } from "./stores/system-configmap";
|
import { useSystemConfigMapStore } from "@console/stores/system-configmap";
|
||||||
import { setupVueQuery } from "./setup/setupVueQuery";
|
import { setupVueQuery } from "@/setup/setupVueQuery";
|
||||||
import { useGlobalInfoStore } from "./stores/global-info";
|
import { useGlobalInfoStore } from "@/stores/global-info";
|
||||||
import { setupCoreModules, setupPluginModules } from "./setup/setupModules";
|
import {
|
||||||
|
setupCoreModules,
|
||||||
|
setupPluginModules,
|
||||||
|
} from "@console/setup/setupModules";
|
||||||
|
|
||||||
const app = createApp(App);
|
const app = createApp(App);
|
||||||
|
|
||||||
|
@ -66,12 +69,6 @@ async function loadActivatedTheme() {
|
||||||
})();
|
})();
|
||||||
|
|
||||||
async function initApp() {
|
async function initApp() {
|
||||||
// TODO 实验性
|
|
||||||
const theme = localStorage.getItem("theme");
|
|
||||||
if (theme) {
|
|
||||||
document.body.classList.add(theme);
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
setupCoreModules(app);
|
setupCoreModules(app);
|
||||||
|
|
|
@ -19,7 +19,7 @@ import { useI18n } from "vue-i18n";
|
||||||
import { inject } from "vue";
|
import { inject } from "vue";
|
||||||
import type { Ref } from "vue";
|
import type { Ref } from "vue";
|
||||||
import { useQueryClient } from "@tanstack/vue-query";
|
import { useQueryClient } from "@tanstack/vue-query";
|
||||||
import { useOperationItemExtensionPoint } from "@/composables/use-operation-extension-points";
|
import { useOperationItemExtensionPoint } from "@console/composables/use-operation-extension-points";
|
||||||
import { toRefs } from "vue";
|
import { toRefs } from "vue";
|
||||||
import type { OperationItem } from "@halo-dev/console-shared";
|
import type { OperationItem } from "@halo-dev/console-shared";
|
||||||
import EntityDropdownItems from "@/components/entity/EntityDropdownItems.vue";
|
import EntityDropdownItems from "@/components/entity/EntityDropdownItems.vue";
|
|
@ -4,7 +4,7 @@ import SubmitButton from "@/components/button/SubmitButton.vue";
|
||||||
import type { Policy, PolicyTemplate } from "@halo-dev/api-client";
|
import type { Policy, PolicyTemplate } from "@halo-dev/api-client";
|
||||||
import cloneDeep from "lodash.clonedeep";
|
import cloneDeep from "lodash.clonedeep";
|
||||||
import { computed, ref, toRaw, watch, watchEffect } from "vue";
|
import { computed, ref, toRaw, watch, watchEffect } from "vue";
|
||||||
import { useSettingForm } from "@/composables/use-setting-form";
|
import { useSettingForm } from "@console/composables/use-setting-form";
|
||||||
import { apiClient } from "@/utils/api-client";
|
import { apiClient } from "@/utils/api-client";
|
||||||
import {
|
import {
|
||||||
reset,
|
reset,
|
|
@ -1,5 +1,5 @@
|
||||||
import { definePlugin } from "@halo-dev/console-shared";
|
import { definePlugin } from "@halo-dev/console-shared";
|
||||||
import BasicLayout from "@/layouts/BasicLayout.vue";
|
import BasicLayout from "@console/layouts/BasicLayout.vue";
|
||||||
import AttachmentList from "./AttachmentList.vue";
|
import AttachmentList from "./AttachmentList.vue";
|
||||||
import AttachmentSelectorModal from "./components/AttachmentSelectorModal.vue";
|
import AttachmentSelectorModal from "./components/AttachmentSelectorModal.vue";
|
||||||
import { IconFolder } from "@halo-dev/components";
|
import { IconFolder } from "@halo-dev/components";
|
|
@ -1,5 +1,5 @@
|
||||||
import { definePlugin } from "@halo-dev/console-shared";
|
import { definePlugin } from "@halo-dev/console-shared";
|
||||||
import BasicLayout from "@/layouts/BasicLayout.vue";
|
import BasicLayout from "@console/layouts/BasicLayout.vue";
|
||||||
import { IconMessage } from "@halo-dev/components";
|
import { IconMessage } from "@halo-dev/components";
|
||||||
import CommentList from "./CommentList.vue";
|
import CommentList from "./CommentList.vue";
|
||||||
import CommentStatsWidget from "./widgets/CommentStatsWidget.vue";
|
import CommentStatsWidget from "./widgets/CommentStatsWidget.vue";
|
|
@ -27,8 +27,8 @@ import { useRouteQuery } from "@vueuse/router";
|
||||||
import cloneDeep from "lodash.clonedeep";
|
import cloneDeep from "lodash.clonedeep";
|
||||||
import { useRouter } from "vue-router";
|
import { useRouter } from "vue-router";
|
||||||
import { randomUUID } from "@/utils/id";
|
import { randomUUID } from "@/utils/id";
|
||||||
import { useContentCache } from "@/composables/use-content-cache";
|
import { useContentCache } from "@console/composables/use-content-cache";
|
||||||
import { useEditorExtensionPoints } from "@/composables/use-editor-extension-points";
|
import { useEditorExtensionPoints } from "@console/composables/use-editor-extension-points";
|
||||||
import type { EditorProvider } from "@halo-dev/console-shared";
|
import type { EditorProvider } from "@halo-dev/console-shared";
|
||||||
import { useLocalStorage } from "@vueuse/core";
|
import { useLocalStorage } from "@vueuse/core";
|
||||||
import EditorProviderSelector from "@/components/dropdown-selector/EditorProviderSelector.vue";
|
import EditorProviderSelector from "@/components/dropdown-selector/EditorProviderSelector.vue";
|
||||||
|
@ -36,9 +36,9 @@ import { useI18n } from "vue-i18n";
|
||||||
import UrlPreviewModal from "@/components/preview/UrlPreviewModal.vue";
|
import UrlPreviewModal from "@/components/preview/UrlPreviewModal.vue";
|
||||||
import { contentAnnotations } from "@/constants/annotations";
|
import { contentAnnotations } from "@/constants/annotations";
|
||||||
import { usePageUpdateMutate } from "./composables/use-page-update-mutate";
|
import { usePageUpdateMutate } from "./composables/use-page-update-mutate";
|
||||||
import { useAutoSaveContent } from "@/composables/use-auto-save-content";
|
import { useAutoSaveContent } from "@console/composables/use-auto-save-content";
|
||||||
import { useContentSnapshot } from "@/composables/use-content-snapshot";
|
import { useContentSnapshot } from "@console/composables/use-content-snapshot";
|
||||||
import { useSaveKeybinding } from "@/composables/use-save-keybinding";
|
import { useSaveKeybinding } from "@console/composables/use-save-keybinding";
|
||||||
|
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
|
@ -10,13 +10,13 @@ import { computed, nextTick, ref, watchEffect } from "vue";
|
||||||
import type { SinglePage } from "@halo-dev/api-client";
|
import type { SinglePage } from "@halo-dev/api-client";
|
||||||
import cloneDeep from "lodash.clonedeep";
|
import cloneDeep from "lodash.clonedeep";
|
||||||
import { apiClient } from "@/utils/api-client";
|
import { apiClient } from "@/utils/api-client";
|
||||||
import { useThemeCustomTemplates } from "@/modules/interface/themes/composables/use-theme";
|
import { useThemeCustomTemplates } from "@console/modules/interface/themes/composables/use-theme";
|
||||||
import { singlePageLabels } from "@/constants/labels";
|
import { singlePageLabels } from "@/constants/labels";
|
||||||
import { randomUUID } from "@/utils/id";
|
import { randomUUID } from "@/utils/id";
|
||||||
import { toDatetimeLocal, toISOString } from "@/utils/date";
|
import { toDatetimeLocal, toISOString } from "@/utils/date";
|
||||||
import { submitForm } from "@formkit/core";
|
import { submitForm } from "@formkit/core";
|
||||||
import AnnotationsForm from "@/components/form/AnnotationsForm.vue";
|
import AnnotationsForm from "@/components/form/AnnotationsForm.vue";
|
||||||
import useSlugify from "@/composables/use-slugify";
|
import useSlugify from "@console/composables/use-slugify";
|
||||||
import { useI18n } from "vue-i18n";
|
import { useI18n } from "vue-i18n";
|
||||||
import { usePageUpdateMutate } from "../composables/use-page-update-mutate";
|
import { usePageUpdateMutate } from "../composables/use-page-update-mutate";
|
||||||
import { FormType } from "@/types/slug";
|
import { FormType } from "@/types/slug";
|
|
@ -1,5 +1,5 @@
|
||||||
import { definePlugin } from "@halo-dev/console-shared";
|
import { definePlugin } from "@halo-dev/console-shared";
|
||||||
import BasicLayout from "@/layouts/BasicLayout.vue";
|
import BasicLayout from "@console/layouts/BasicLayout.vue";
|
||||||
import SinglePageList from "./SinglePageList.vue";
|
import SinglePageList from "./SinglePageList.vue";
|
||||||
import DeletedSinglePageList from "./DeletedSinglePageList.vue";
|
import DeletedSinglePageList from "./DeletedSinglePageList.vue";
|
||||||
import SinglePageEditor from "./SinglePageEditor.vue";
|
import SinglePageEditor from "./SinglePageEditor.vue";
|
|
@ -27,8 +27,8 @@ import { apiClient } from "@/utils/api-client";
|
||||||
import { useRouteQuery } from "@vueuse/router";
|
import { useRouteQuery } from "@vueuse/router";
|
||||||
import { useRouter } from "vue-router";
|
import { useRouter } from "vue-router";
|
||||||
import { randomUUID } from "@/utils/id";
|
import { randomUUID } from "@/utils/id";
|
||||||
import { useContentCache } from "@/composables/use-content-cache";
|
import { useContentCache } from "@console/composables/use-content-cache";
|
||||||
import { useEditorExtensionPoints } from "@/composables/use-editor-extension-points";
|
import { useEditorExtensionPoints } from "@console/composables/use-editor-extension-points";
|
||||||
import type { EditorProvider } from "@halo-dev/console-shared";
|
import type { EditorProvider } from "@halo-dev/console-shared";
|
||||||
import { useLocalStorage } from "@vueuse/core";
|
import { useLocalStorage } from "@vueuse/core";
|
||||||
import EditorProviderSelector from "@/components/dropdown-selector/EditorProviderSelector.vue";
|
import EditorProviderSelector from "@/components/dropdown-selector/EditorProviderSelector.vue";
|
||||||
|
@ -36,9 +36,9 @@ import { useI18n } from "vue-i18n";
|
||||||
import UrlPreviewModal from "@/components/preview/UrlPreviewModal.vue";
|
import UrlPreviewModal from "@/components/preview/UrlPreviewModal.vue";
|
||||||
import { usePostUpdateMutate } from "./composables/use-post-update-mutate";
|
import { usePostUpdateMutate } from "./composables/use-post-update-mutate";
|
||||||
import { contentAnnotations } from "@/constants/annotations";
|
import { contentAnnotations } from "@/constants/annotations";
|
||||||
import { useAutoSaveContent } from "@/composables/use-auto-save-content";
|
import { useAutoSaveContent } from "@console/composables/use-auto-save-content";
|
||||||
import { useContentSnapshot } from "@/composables/use-content-snapshot";
|
import { useContentSnapshot } from "@console/composables/use-content-snapshot";
|
||||||
import { useSaveKeybinding } from "@/composables/use-save-keybinding";
|
import { useSaveKeybinding } from "@console/composables/use-save-keybinding";
|
||||||
|
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
|
@ -20,9 +20,9 @@ import type { Category } from "@halo-dev/api-client";
|
||||||
import cloneDeep from "lodash.clonedeep";
|
import cloneDeep from "lodash.clonedeep";
|
||||||
import { reset } from "@formkit/core";
|
import { reset } from "@formkit/core";
|
||||||
import { setFocus } from "@/formkit/utils/focus";
|
import { setFocus } from "@/formkit/utils/focus";
|
||||||
import { useThemeCustomTemplates } from "@/modules/interface/themes/composables/use-theme";
|
import { useThemeCustomTemplates } from "@console/modules/interface/themes/composables/use-theme";
|
||||||
import AnnotationsForm from "@/components/form/AnnotationsForm.vue";
|
import AnnotationsForm from "@/components/form/AnnotationsForm.vue";
|
||||||
import useSlugify from "@/composables/use-slugify";
|
import useSlugify from "@console/composables/use-slugify";
|
||||||
import { useI18n } from "vue-i18n";
|
import { useI18n } from "vue-i18n";
|
||||||
import { FormType } from "@/types/slug";
|
import { FormType } from "@/types/slug";
|
||||||
|
|
|
@ -2,8 +2,8 @@ import { apiClient } from "@/utils/api-client";
|
||||||
import type { Category } from "@halo-dev/api-client";
|
import type { Category } from "@halo-dev/api-client";
|
||||||
import type { Ref } from "vue";
|
import type { Ref } from "vue";
|
||||||
import { ref } from "vue";
|
import { ref } from "vue";
|
||||||
import type { CategoryTree } from "@/modules/contents/posts/categories/utils";
|
import type { CategoryTree } from "@console/modules/contents/posts/categories/utils";
|
||||||
import { buildCategoriesTree } from "@/modules/contents/posts/categories/utils";
|
import { buildCategoriesTree } from "@console/modules/contents/posts/categories/utils";
|
||||||
import { Dialog, Toast } from "@halo-dev/components";
|
import { Dialog, Toast } from "@halo-dev/components";
|
||||||
import { useQuery } from "@tanstack/vue-query";
|
import { useQuery } from "@tanstack/vue-query";
|
||||||
import { useI18n } from "vue-i18n";
|
import { useI18n } from "vue-i18n";
|
|
@ -16,8 +16,8 @@ import { useQueryClient } from "@tanstack/vue-query";
|
||||||
import type { Ref } from "vue";
|
import type { Ref } from "vue";
|
||||||
import { computed, toRefs, markRaw, ref, inject } from "vue";
|
import { computed, toRefs, markRaw, ref, inject } from "vue";
|
||||||
import { useRouter } from "vue-router";
|
import { useRouter } from "vue-router";
|
||||||
import { useEntityFieldItemExtensionPoint } from "@/composables/use-entity-extension-points";
|
import { useEntityFieldItemExtensionPoint } from "@console/composables/use-entity-extension-points";
|
||||||
import { useOperationItemExtensionPoint } from "@/composables/use-operation-extension-points";
|
import { useOperationItemExtensionPoint } from "@console/composables/use-operation-extension-points";
|
||||||
import EntityDropdownItems from "@/components/entity/EntityDropdownItems.vue";
|
import EntityDropdownItems from "@/components/entity/EntityDropdownItems.vue";
|
||||||
import type { EntityFieldItem, OperationItem } from "@halo-dev/console-shared";
|
import type { EntityFieldItem, OperationItem } from "@halo-dev/console-shared";
|
||||||
import TitleField from "./entity-fields/TitleField.vue";
|
import TitleField from "./entity-fields/TitleField.vue";
|
|
@ -10,13 +10,13 @@ import { computed, nextTick, ref, watchEffect } from "vue";
|
||||||
import type { Post } from "@halo-dev/api-client";
|
import type { Post } from "@halo-dev/api-client";
|
||||||
import cloneDeep from "lodash.clonedeep";
|
import cloneDeep from "lodash.clonedeep";
|
||||||
import { apiClient } from "@/utils/api-client";
|
import { apiClient } from "@/utils/api-client";
|
||||||
import { useThemeCustomTemplates } from "@/modules/interface/themes/composables/use-theme";
|
import { useThemeCustomTemplates } from "@console/modules/interface/themes/composables/use-theme";
|
||||||
import { postLabels } from "@/constants/labels";
|
import { postLabels } from "@/constants/labels";
|
||||||
import { randomUUID } from "@/utils/id";
|
import { randomUUID } from "@/utils/id";
|
||||||
import { toDatetimeLocal, toISOString } from "@/utils/date";
|
import { toDatetimeLocal, toISOString } from "@/utils/date";
|
||||||
import AnnotationsForm from "@/components/form/AnnotationsForm.vue";
|
import AnnotationsForm from "@/components/form/AnnotationsForm.vue";
|
||||||
import { submitForm } from "@formkit/core";
|
import { submitForm } from "@formkit/core";
|
||||||
import useSlugify from "@/composables/use-slugify";
|
import useSlugify from "@console/composables/use-slugify";
|
||||||
import { useI18n } from "vue-i18n";
|
import { useI18n } from "vue-i18n";
|
||||||
import { usePostUpdateMutate } from "../composables/use-post-update-mutate";
|
import { usePostUpdateMutate } from "../composables/use-post-update-mutate";
|
||||||
import { FormType } from "@/types/slug";
|
import { FormType } from "@/types/slug";
|
|
@ -1,7 +1,7 @@
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { VEntityField } from "@halo-dev/components";
|
import { VEntityField } from "@halo-dev/components";
|
||||||
import type { ListedPost } from "@halo-dev/api-client";
|
import type { ListedPost } from "@halo-dev/api-client";
|
||||||
import ContributorList from "@/modules/contents/_components/ContributorList.vue";
|
import ContributorList from "@console/modules/contents/_components/ContributorList.vue";
|
||||||
|
|
||||||
withDefaults(
|
withDefaults(
|
||||||
defineProps<{
|
defineProps<{
|
|
@ -1,6 +1,6 @@
|
||||||
import { definePlugin } from "@halo-dev/console-shared";
|
import { definePlugin } from "@halo-dev/console-shared";
|
||||||
import BasicLayout from "@/layouts/BasicLayout.vue";
|
import BasicLayout from "@console/layouts/BasicLayout.vue";
|
||||||
import BlankLayout from "@/layouts/BlankLayout.vue";
|
import BlankLayout from "@console/layouts/BlankLayout.vue";
|
||||||
import { IconBookRead } from "@halo-dev/components";
|
import { IconBookRead } from "@halo-dev/components";
|
||||||
import PostList from "./PostList.vue";
|
import PostList from "./PostList.vue";
|
||||||
import DeletedPostList from "./DeletedPostList.vue";
|
import DeletedPostList from "./DeletedPostList.vue";
|
|
@ -23,7 +23,7 @@ import cloneDeep from "lodash.clonedeep";
|
||||||
import { reset } from "@formkit/core";
|
import { reset } from "@formkit/core";
|
||||||
import { setFocus } from "@/formkit/utils/focus";
|
import { setFocus } from "@/formkit/utils/focus";
|
||||||
import AnnotationsForm from "@/components/form/AnnotationsForm.vue";
|
import AnnotationsForm from "@/components/form/AnnotationsForm.vue";
|
||||||
import useSlugify from "@/composables/use-slugify";
|
import useSlugify from "@console/composables/use-slugify";
|
||||||
import { useI18n } from "vue-i18n";
|
import { useI18n } from "vue-i18n";
|
||||||
import { FormType } from "@/types/slug";
|
import { FormType } from "@/types/slug";
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import { definePlugin } from "@halo-dev/console-shared";
|
import { definePlugin } from "@halo-dev/console-shared";
|
||||||
import BasicLayout from "@/layouts/BasicLayout.vue";
|
import BasicLayout from "@console/layouts/BasicLayout.vue";
|
||||||
import Dashboard from "./Dashboard.vue";
|
import Dashboard from "./Dashboard.vue";
|
||||||
import { IconDashboard } from "@halo-dev/components";
|
import { IconDashboard } from "@halo-dev/components";
|
||||||
|
|
|
@ -11,13 +11,13 @@ import {
|
||||||
IconSearch,
|
IconSearch,
|
||||||
IconDatabase2Line,
|
IconDatabase2Line,
|
||||||
VCard,
|
VCard,
|
||||||
IconUserLine,
|
IconAccountCircleLine,
|
||||||
Dialog,
|
Dialog,
|
||||||
Toast,
|
Toast,
|
||||||
} from "@halo-dev/components";
|
} from "@halo-dev/components";
|
||||||
import { markRaw, ref, type Component } from "vue";
|
import { markRaw, ref, type Component } from "vue";
|
||||||
import { useRouter } from "vue-router";
|
import { useRouter } from "vue-router";
|
||||||
import ThemePreviewModal from "@/modules/interface/themes/components/preview/ThemePreviewModal.vue";
|
import ThemePreviewModal from "@console/modules/interface/themes/components/preview/ThemePreviewModal.vue";
|
||||||
import { apiClient } from "@/utils/api-client";
|
import { apiClient } from "@/utils/api-client";
|
||||||
import { useI18n } from "vue-i18n";
|
import { useI18n } from "vue-i18n";
|
||||||
import { OverlayScrollbarsComponent } from "overlayscrollbars-vue";
|
import { OverlayScrollbarsComponent } from "overlayscrollbars-vue";
|
||||||
|
@ -37,15 +37,12 @@ const { t } = useI18n();
|
||||||
|
|
||||||
const actions: Action[] = [
|
const actions: Action[] = [
|
||||||
{
|
{
|
||||||
icon: markRaw(IconUserLine),
|
icon: markRaw(IconAccountCircleLine),
|
||||||
title: t(
|
title: t(
|
||||||
"core.dashboard.widgets.presets.quicklink.actions.user_profile.title"
|
"core.dashboard.widgets.presets.quicklink.actions.user_center.title"
|
||||||
),
|
),
|
||||||
action: () => {
|
action: () => {
|
||||||
router.push({
|
window.location.href = "/uc/profile";
|
||||||
name: "UserDetail",
|
|
||||||
params: { name: "-" },
|
|
||||||
});
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
|
@ -9,7 +9,7 @@ import {
|
||||||
} from "@halo-dev/components";
|
} from "@halo-dev/components";
|
||||||
import Draggable from "vuedraggable";
|
import Draggable from "vuedraggable";
|
||||||
import { ref } from "vue";
|
import { ref } from "vue";
|
||||||
import type { MenuTreeItem } from "@/modules/interface/menus/utils";
|
import type { MenuTreeItem } from "@console/modules/interface/menus/utils";
|
||||||
import { usePermission } from "@/utils/permission";
|
import { usePermission } from "@/utils/permission";
|
||||||
import { useI18n } from "vue-i18n";
|
import { useI18n } from "vue-i18n";
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import { definePlugin } from "@halo-dev/console-shared";
|
import { definePlugin } from "@halo-dev/console-shared";
|
||||||
import BasicLayout from "@/layouts/BasicLayout.vue";
|
import BasicLayout from "@console/layouts/BasicLayout.vue";
|
||||||
import Menus from "./Menus.vue";
|
import Menus from "./Menus.vue";
|
||||||
import { IconListSettings } from "@halo-dev/components";
|
import { IconListSettings } from "@halo-dev/components";
|
||||||
import { markRaw } from "vue";
|
import { markRaw } from "vue";
|
|
@ -11,7 +11,7 @@ import type { ConfigMap, Setting, Theme } from "@halo-dev/api-client";
|
||||||
|
|
||||||
// hooks
|
// hooks
|
||||||
import { apiClient } from "@/utils/api-client";
|
import { apiClient } from "@/utils/api-client";
|
||||||
import { useSettingFormConvert } from "@/composables/use-setting-form";
|
import { useSettingFormConvert } from "@console/composables/use-setting-form";
|
||||||
import { useI18n } from "vue-i18n";
|
import { useI18n } from "vue-i18n";
|
||||||
import { useQuery, useQueryClient } from "@tanstack/vue-query";
|
import { useQuery, useQueryClient } from "@tanstack/vue-query";
|
||||||
|
|
|
@ -16,7 +16,7 @@ import { useThemeLifeCycle } from "../composables/use-theme";
|
||||||
import { usePermission } from "@/utils/permission";
|
import { usePermission } from "@/utils/permission";
|
||||||
import { useI18n } from "vue-i18n";
|
import { useI18n } from "vue-i18n";
|
||||||
import { useQueryClient } from "@tanstack/vue-query";
|
import { useQueryClient } from "@tanstack/vue-query";
|
||||||
import { useOperationItemExtensionPoint } from "@/composables/use-operation-extension-points";
|
import { useOperationItemExtensionPoint } from "@console/composables/use-operation-extension-points";
|
||||||
import { markRaw } from "vue";
|
import { markRaw } from "vue";
|
||||||
import UninstallOperationItem from "./operation/UninstallOperationItem.vue";
|
import UninstallOperationItem from "./operation/UninstallOperationItem.vue";
|
||||||
import { computed } from "vue";
|
import { computed } from "vue";
|
|
@ -12,7 +12,7 @@ import { ref, inject, type Ref } from "vue";
|
||||||
import type { Theme } from "@halo-dev/api-client";
|
import type { Theme } from "@halo-dev/api-client";
|
||||||
import { apiClient } from "@/utils/api-client";
|
import { apiClient } from "@/utils/api-client";
|
||||||
import { useQuery } from "@tanstack/vue-query";
|
import { useQuery } from "@tanstack/vue-query";
|
||||||
import { useThemeStore } from "@/stores/theme";
|
import { useThemeStore } from "@console/stores/theme";
|
||||||
|
|
||||||
const themeStore = useThemeStore();
|
const themeStore = useThemeStore();
|
||||||
|
|
|
@ -10,7 +10,7 @@ import { useI18n } from "vue-i18n";
|
||||||
import { inject } from "vue";
|
import { inject } from "vue";
|
||||||
import type { Ref } from "vue";
|
import type { Ref } from "vue";
|
||||||
import { ref } from "vue";
|
import { ref } from "vue";
|
||||||
import { useThemeStore } from "@/stores/theme";
|
import { useThemeStore } from "@console/stores/theme";
|
||||||
import { apiClient } from "@/utils/api-client";
|
import { apiClient } from "@/utils/api-client";
|
||||||
import UppyUpload from "@/components/upload/UppyUpload.vue";
|
import UppyUpload from "@/components/upload/UppyUpload.vue";
|
||||||
|
|
|
@ -7,7 +7,7 @@ import { inject } from "vue";
|
||||||
import { ref } from "vue";
|
import { ref } from "vue";
|
||||||
import { useI18n } from "vue-i18n";
|
import { useI18n } from "vue-i18n";
|
||||||
import type { ThemeInstallationErrorResponse } from "../../types";
|
import type { ThemeInstallationErrorResponse } from "../../types";
|
||||||
import { useThemeStore } from "@/stores/theme";
|
import { useThemeStore } from "@console/stores/theme";
|
||||||
import { THEME_ALREADY_EXISTS_TYPE } from "../../constants";
|
import { THEME_ALREADY_EXISTS_TYPE } from "../../constants";
|
||||||
import { useRouteQuery } from "@vueuse/router";
|
import { useRouteQuery } from "@vueuse/router";
|
||||||
import { onMounted } from "vue";
|
import { onMounted } from "vue";
|
|
@ -1,7 +1,7 @@
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import ThemePreviewListItem from "./ThemePreviewListItem.vue";
|
import ThemePreviewListItem from "./ThemePreviewListItem.vue";
|
||||||
import { useSettingFormConvert } from "@/composables/use-setting-form";
|
import { useSettingFormConvert } from "@console/composables/use-setting-form";
|
||||||
import { useThemeStore } from "@/stores/theme";
|
import { useThemeStore } from "@console/stores/theme";
|
||||||
import { apiClient } from "@/utils/api-client";
|
import { apiClient } from "@/utils/api-client";
|
||||||
import type {
|
import type {
|
||||||
ConfigMap,
|
ConfigMap,
|
|
@ -3,7 +3,7 @@ import { computed, ref } from "vue";
|
||||||
import type { Theme } from "@halo-dev/api-client";
|
import type { Theme } from "@halo-dev/api-client";
|
||||||
import { apiClient } from "@/utils/api-client";
|
import { apiClient } from "@/utils/api-client";
|
||||||
import { Dialog, Toast } from "@halo-dev/components";
|
import { Dialog, Toast } from "@halo-dev/components";
|
||||||
import { useThemeStore } from "@/stores/theme";
|
import { useThemeStore } from "@console/stores/theme";
|
||||||
import { storeToRefs } from "pinia";
|
import { storeToRefs } from "pinia";
|
||||||
import { useI18n } from "vue-i18n";
|
import { useI18n } from "vue-i18n";
|
||||||
|
|
|
@ -10,7 +10,7 @@ import cloneDeep from "lodash.clonedeep";
|
||||||
// hooks
|
// hooks
|
||||||
import { useThemeLifeCycle } from "../composables/use-theme";
|
import { useThemeLifeCycle } from "../composables/use-theme";
|
||||||
// types
|
// types
|
||||||
import BasicLayout from "@/layouts/BasicLayout.vue";
|
import BasicLayout from "@console/layouts/BasicLayout.vue";
|
||||||
|
|
||||||
// components
|
// components
|
||||||
import {
|
import {
|
||||||
|
@ -31,7 +31,7 @@ import ThemeListModal from "../components/ThemeListModal.vue";
|
||||||
import ThemePreviewModal from "../components/preview/ThemePreviewModal.vue";
|
import ThemePreviewModal from "../components/preview/ThemePreviewModal.vue";
|
||||||
import type { Setting, SettingForm, Theme } from "@halo-dev/api-client";
|
import type { Setting, SettingForm, Theme } from "@halo-dev/api-client";
|
||||||
import { usePermission } from "@/utils/permission";
|
import { usePermission } from "@/utils/permission";
|
||||||
import { useThemeStore } from "@/stores/theme";
|
import { useThemeStore } from "@console/stores/theme";
|
||||||
import { storeToRefs } from "pinia";
|
import { storeToRefs } from "pinia";
|
||||||
import { apiClient } from "@/utils/api-client";
|
import { apiClient } from "@/utils/api-client";
|
||||||
import { useI18n } from "vue-i18n";
|
import { useI18n } from "vue-i18n";
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue