feat: add prerelease visibility toggle

This commit is contained in:
Soulter
2026-06-20 22:23:25 +08:00
parent ddc4e142c7
commit f9d4082217
4 changed files with 51 additions and 2 deletions

View File

@@ -26,7 +26,9 @@
"release": "😊 Release" "release": "😊 Release"
}, },
"advancedSettings": "Advanced settings", "advancedSettings": "Advanced settings",
"releases": "Releases",
"updateToLatest": "Update to Latest Version", "updateToLatest": "Update to Latest Version",
"showPreReleases": "Show pre-release versions",
"preRelease": "Pre-release", "preRelease": "Pre-release",
"preReleaseWarning": { "preReleaseWarning": {
"title": "Pre-release Version Notice", "title": "Pre-release Version Notice",

View File

@@ -26,7 +26,9 @@
"release": "😊 Релиз" "release": "😊 Релиз"
}, },
"advancedSettings": "Расширенные настройки", "advancedSettings": "Расширенные настройки",
"releases": "Релизы",
"updateToLatest": "Обновить до последней версии", "updateToLatest": "Обновить до последней версии",
"showPreReleases": "Показывать предварительные версии",
"preRelease": "Предварительная версия", "preRelease": "Предварительная версия",
"preReleaseWarning": { "preReleaseWarning": {
"title": "Внимание: предварительная версия", "title": "Внимание: предварительная версия",

View File

@@ -26,7 +26,9 @@
"release": "😊 正式版" "release": "😊 正式版"
}, },
"advancedSettings": "高级设置", "advancedSettings": "高级设置",
"releases": "版本列表",
"updateToLatest": "更新到最新版本", "updateToLatest": "更新到最新版本",
"showPreReleases": "显示预发布版本",
"preRelease": "预发布", "preRelease": "预发布",
"preReleaseWarning": { "preReleaseWarning": {
"title": "预发布版本提醒", "title": "预发布版本提醒",

View File

@@ -30,6 +30,7 @@ const { t } = useI18n();
const route = useRoute(); const route = useRoute();
const LAST_BOT_ROUTE_KEY = "astrbot:last_bot_route"; const LAST_BOT_ROUTE_KEY = "astrbot:last_bot_route";
const LAST_CHAT_ROUTE_KEY = "astrbot:last_chat_route"; const LAST_CHAT_ROUTE_KEY = "astrbot:last_chat_route";
const SHOW_PRE_RELEASES_KEY = "astrbot:updateDialog:showPreReleases";
let dialog = ref(false); let dialog = ref(false);
let accountWarning = ref(false); let accountWarning = ref(false);
let accountWarningMd5 = ref(false); let accountWarningMd5 = ref(false);
@@ -50,6 +51,11 @@ let dashboardHasNewVersion = ref(false);
let dashboardCurrentVersion = ref(""); let dashboardCurrentVersion = ref("");
let releases = ref<any[]>([]); let releases = ref<any[]>([]);
let releasesLoading = ref(false); let releasesLoading = ref(false);
const showPreReleases = ref(
typeof window === "undefined"
? false
: localStorage.getItem(SHOW_PRE_RELEASES_KEY) === "true",
);
let updatingDashboardLoading = ref(false); let updatingDashboardLoading = ref(false);
let installLoading = ref(false); let installLoading = ref(false);
let showAdvancedUpdateSettings = ref(false); let showAdvancedUpdateSettings = ref(false);
@@ -150,7 +156,12 @@ const releasesHeader = computed(() => [
{ title: t("core.header.updateDialog.table.content"), key: "body" }, { title: t("core.header.updateDialog.table.content"), key: "body" },
{ title: t("core.header.updateDialog.table.actions"), key: "switch" }, { title: t("core.header.updateDialog.table.actions"), key: "switch" },
]); ]);
const firstReleasePageItems = computed(() => releases.value.slice(0, 6)); const visibleReleases = computed(() =>
showPreReleases.value
? releases.value
: releases.value.filter((item: any) => !isPreRelease(item.tag_name)),
);
const firstReleasePageItems = computed(() => visibleReleases.value.slice(0, 6));
const firstReleasePageHasPreRelease = computed(() => const firstReleasePageHasPreRelease = computed(() =>
firstReleasePageItems.value.some((item: any) => isPreRelease(item.tag_name)), firstReleasePageItems.value.some((item: any) => isPreRelease(item.tag_name)),
); );
@@ -883,6 +894,11 @@ onMounted(() => {
// 监听 viewMode 变化,切换到 bot 模式时跳转到首页 // 监听 viewMode 变化,切换到 bot 模式时跳转到首页
// 保存 bot 模式的最後路由 // 保存 bot 模式的最後路由
// 監聽 route 變化,保存最後一次 bot 路由 // 監聽 route 變化,保存最後一次 bot 路由
watch(showPreReleases, (value) => {
if (typeof window === "undefined") return;
localStorage.setItem(SHOW_PRE_RELEASES_KEY, value ? "true" : "false");
});
watch( watch(
() => route.fullPath, () => route.fullPath,
(newPath) => { (newPath) => {
@@ -1456,6 +1472,21 @@ onMounted(async () => {
<!-- 发行版 --> <!-- 发行版 -->
<div class="mt-5"> <div class="mt-5">
<div class="release-table-toolbar mb-3">
<div class="text-subtitle-1 font-weight-medium">
{{ t("core.header.updateDialog.releases") }}
</div>
<v-switch
v-model="showPreReleases"
class="release-prerelease-switch"
color="warning"
density="compact"
hide-details
inset
:label="t('core.header.updateDialog.showPreReleases')"
></v-switch>
</div>
<v-alert <v-alert
v-if="!installLoading && firstReleasePageHasPreRelease" v-if="!installLoading && firstReleasePageHasPreRelease"
type="warning" type="warning"
@@ -1489,7 +1520,7 @@ onMounted(async () => {
<v-data-table <v-data-table
:headers="releasesHeader" :headers="releasesHeader"
:items="releases" :items="visibleReleases"
item-key="name" item-key="name"
:items-per-page="6" :items-per-page="6"
density="comfortable" density="comfortable"
@@ -1913,6 +1944,18 @@ onMounted(async () => {
margin-left: 0; margin-left: 0;
} }
.release-table-toolbar {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
flex-wrap: wrap;
}
.release-prerelease-switch {
flex: 0 1 auto;
}
/* 响应式布局样式 */ /* 响应式布局样式 */
.logo-container { .logo-container {
margin-left: 10px; margin-left: 10px;