From 4e0dfb4ccc3d493bf35f1171b78c1528600d1cd5 Mon Sep 17 00:00:00 2001 From: mzwing Date: Mon, 23 Mar 2026 01:34:53 +0800 Subject: [PATCH 1/5] feat(webui): support for commit hash update (implement #6782) --- .../src/i18n/locales/en-US/core/header.json | 9 +++++- .../src/i18n/locales/ru-RU/core/header.json | 9 +++++- .../src/i18n/locales/zh-CN/core/header.json | 9 +++++- .../full/vertical-header/VerticalHeader.vue | 32 +++++++++++++++++++ 4 files changed, 56 insertions(+), 3 deletions(-) diff --git a/dashboard/src/i18n/locales/en-US/core/header.json b/dashboard/src/i18n/locales/en-US/core/header.json index 4da98b8dd8..7e129ecd63 100644 --- a/dashboard/src/i18n/locales/en-US/core/header.json +++ b/dashboard/src/i18n/locales/en-US/core/header.json @@ -47,6 +47,13 @@ "releaseNotes": { "title": "Release Notes" }, + "commitHash": { + "title": "Update via Commit Hash", + "description": "Enter a 40-character commit hash from the GitHub repository to install unreleased fixes and features.", + "placeholder": "Enter commit hash", + "install": "Install", + "invalidFormat": "Please enter a valid 40-character hexadecimal commit hash" + }, "redirectConfirm": { "title": "Leaving AstrBot", "message": "You are about to open the GitHub Releases page. Continue?", @@ -105,4 +112,4 @@ "updateFailed": "Update failed, please try again" } } -} +} \ No newline at end of file diff --git a/dashboard/src/i18n/locales/ru-RU/core/header.json b/dashboard/src/i18n/locales/ru-RU/core/header.json index a23f3dfd33..3e15dddaa6 100644 --- a/dashboard/src/i18n/locales/ru-RU/core/header.json +++ b/dashboard/src/i18n/locales/ru-RU/core/header.json @@ -1,4 +1,4 @@ -{ +{ "logoTitle": "Панель управления AstrBot", "version": { "hasNewVersion": "Доступна новая версия AstrBot!", @@ -47,6 +47,13 @@ "releaseNotes": { "title": "Журнал изменений" }, + "commitHash": { + "title": "Обновление через Commit Hash", + "description": "Введите 40-значный хеш фиксации из репозитория GitHub, чтобы установить невыпущенные исправления и функции.", + "placeholder": "Введите хеш фиксации", + "install": "Установить", + "invalidFormat": "Введите действительный 40-значный шестнадцатеричный хеш фиксации" + }, "redirectConfirm": { "title": "Переход по ссылке", "message": "Вы будете перенаправлены на страницу GitHub Releases. Продолжить?", diff --git a/dashboard/src/i18n/locales/zh-CN/core/header.json b/dashboard/src/i18n/locales/zh-CN/core/header.json index 3bb9850331..b3ffc7f1eb 100644 --- a/dashboard/src/i18n/locales/zh-CN/core/header.json +++ b/dashboard/src/i18n/locales/zh-CN/core/header.json @@ -47,6 +47,13 @@ "releaseNotes": { "title": "更新日志" }, + "commitHash": { + "title": "通过 Commit Hash 更新", + "description": "输入 GitHub 仓库的 40 位 commit hash,可以安装尚未发布至正式版的修复和功能。", + "placeholder": "输入 commit hash", + "install": "安装", + "invalidFormat": "请输入有效的 40 位十六进制 commit hash" + }, "redirectConfirm": { "title": "即将跳转", "message": "将跳转到 GitHub Releases 页面,是否继续?", @@ -105,4 +112,4 @@ "updateFailed": "修改失败,请重试" } } -} +} \ No newline at end of file diff --git a/dashboard/src/layouts/full/vertical-header/VerticalHeader.vue b/dashboard/src/layouts/full/vertical-header/VerticalHeader.vue index aa627baeaf..c2b7fbdcf3 100644 --- a/dashboard/src/layouts/full/vertical-header/VerticalHeader.vue +++ b/dashboard/src/layouts/full/vertical-header/VerticalHeader.vue @@ -48,6 +48,7 @@ let version = ref(''); let releases = ref([]); let updatingDashboardLoading = ref(false); let installLoading = ref(false); +let commitHashInput = ref(''); const isDesktopReleaseMode = ref( typeof window !== 'undefined' && !!window.astrbotDesktop?.isDesktop ); @@ -93,6 +94,10 @@ const releasesHeader = computed(() => [ { title: t('core.header.updateDialog.table.sourceUrl'), key: 'zipball_url' }, { title: t('core.header.updateDialog.table.actions'), key: 'switch' } ]); + +const commitHashRules = computed(() => [ + (v: string) => !v || /^[0-9a-f]{40}$/i.test(v) || t('core.header.updateDialog.commitHash.invalidFormat') +]); // Form validation const formValid = ref(true); const passwordRules = computed(() => [ @@ -729,6 +734,33 @@ onMounted(async () => { + +
+

{{ t('core.header.updateDialog.commitHash.title') }}

+ {{ t('core.header.updateDialog.commitHash.description') }} +
+ + + {{ t('core.header.updateDialog.commitHash.install') }} + +
+
+

{{ t('core.header.updateDialog.dashboardUpdate.title') }}

From 4ecb91bf090e2723ac386afadaa859c2f74ff658 Mon Sep 17 00:00:00 2001 From: mzwing Date: Mon, 23 Mar 2026 01:38:02 +0800 Subject: [PATCH 2/5] chore(webui): run lint and subset-icons --- .../mdi-subset/materialdesignicons-subset.css | 6 +++++- .../materialdesignicons-webfont-subset.woff | Bin 16252 -> 16340 bytes .../materialdesignicons-webfont-subset.woff2 | Bin 13068 -> 13128 bytes 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/dashboard/src/assets/mdi-subset/materialdesignicons-subset.css b/dashboard/src/assets/mdi-subset/materialdesignicons-subset.css index 52a052cfa1..0e7df67891 100644 --- a/dashboard/src/assets/mdi-subset/materialdesignicons-subset.css +++ b/dashboard/src/assets/mdi-subset/materialdesignicons-subset.css @@ -1,4 +1,4 @@ -/* Auto-generated MDI subset – 231 icons */ +/* Auto-generated MDI subset – 232 icons */ /* Do not edit manually. Run: pnpm run subset-icons */ @font-face { @@ -728,6 +728,10 @@ content: "\F0A66"; } +.mdi-qrcode::before { + content: "\F0432"; +} + .mdi-refresh::before { content: "\F0450"; } diff --git a/dashboard/src/assets/mdi-subset/materialdesignicons-webfont-subset.woff b/dashboard/src/assets/mdi-subset/materialdesignicons-webfont-subset.woff index 85c2ed9fdfa09200ceb1892ce611e8570eb76b5e..fed2ed24505f227d679c4d7b806ad0f3e9906ffb 100644 GIT binary patch delta 15865 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 N1^_U)0;ZEsKZUy&kOlw% diff --git a/dashboard/src/assets/mdi-subset/materialdesignicons-webfont-subset.woff2 b/dashboard/src/assets/mdi-subset/materialdesignicons-webfont-subset.woff2 index 376e47ce72445b88b80adb0605c7e6319dcebd22..41c2b7984238ccfb376144a2d4a6a1dac0b5d18d 100644 GIT binary patch literal 13128 zcmV-OGq=olPew8T0RR9105eDc3jhEB0CS8005bIe0RR9100000000000000000000 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 literal 13068 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

e}-wIw&OMNDf;Y`8XQ&b$2Ir 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 From d8730bc47752bd993a420c169b80253f63b801a2 Mon Sep 17 00:00:00 2001 From: mzwing Date: Mon, 23 Mar 2026 02:15:01 +0800 Subject: [PATCH 3/5] fix(webui): standardize commit hash input, avoid re-compile of regex --- .../src/layouts/full/vertical-header/VerticalHeader.vue | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/dashboard/src/layouts/full/vertical-header/VerticalHeader.vue b/dashboard/src/layouts/full/vertical-header/VerticalHeader.vue index c2b7fbdcf3..f100aa2516 100644 --- a/dashboard/src/layouts/full/vertical-header/VerticalHeader.vue +++ b/dashboard/src/layouts/full/vertical-header/VerticalHeader.vue @@ -95,8 +95,11 @@ const releasesHeader = computed(() => [ { title: t('core.header.updateDialog.table.actions'), key: 'switch' } ]); +const commitHashRegex = /^[0-9a-f]{40}$/i; +const isCommitHashValid = computed(() => commitHashRegex.test(commitHashInput.value)); + const commitHashRules = computed(() => [ - (v: string) => !v || /^[0-9a-f]{40}$/i.test(v) || t('core.header.updateDialog.commitHash.invalidFormat') + (v: string) => !v || commitHashRegex.test(v) || t('core.header.updateDialog.commitHash.invalidFormat') ]); // Form validation const formValid = ref(true); @@ -740,7 +743,7 @@ onMounted(async () => { {{ t('core.header.updateDialog.commitHash.description') }}

{ From 3c7dd44b65b33953d1ef324901c1ad8eeb35b24d Mon Sep 17 00:00:00 2001 From: mzwing Date: Mon, 23 Mar 2026 02:26:15 +0800 Subject: [PATCH 4/5] chore(webui): fix no new line in json file, extract inline style into style tag --- dashboard/src/i18n/locales/en-US/core/header.json | 2 +- dashboard/src/i18n/locales/ru-RU/core/header.json | 2 +- dashboard/src/i18n/locales/zh-CN/core/header.json | 2 +- .../full/vertical-header/VerticalHeader.vue | 15 ++++++++++++--- 4 files changed, 15 insertions(+), 6 deletions(-) diff --git a/dashboard/src/i18n/locales/en-US/core/header.json b/dashboard/src/i18n/locales/en-US/core/header.json index 7e129ecd63..3591a175d7 100644 --- a/dashboard/src/i18n/locales/en-US/core/header.json +++ b/dashboard/src/i18n/locales/en-US/core/header.json @@ -112,4 +112,4 @@ "updateFailed": "Update failed, please try again" } } -} \ No newline at end of file +} diff --git a/dashboard/src/i18n/locales/ru-RU/core/header.json b/dashboard/src/i18n/locales/ru-RU/core/header.json index 3e15dddaa6..f9dd1b5148 100644 --- a/dashboard/src/i18n/locales/ru-RU/core/header.json +++ b/dashboard/src/i18n/locales/ru-RU/core/header.json @@ -112,4 +112,4 @@ "updateFailed": "Ошибка обновления, попробуйте еще раз" } } -} \ No newline at end of file +} diff --git a/dashboard/src/i18n/locales/zh-CN/core/header.json b/dashboard/src/i18n/locales/zh-CN/core/header.json index b3ffc7f1eb..39373bc8d5 100644 --- a/dashboard/src/i18n/locales/zh-CN/core/header.json +++ b/dashboard/src/i18n/locales/zh-CN/core/header.json @@ -112,4 +112,4 @@ "updateFailed": "修改失败,请重试" } } -} \ No newline at end of file +} diff --git a/dashboard/src/layouts/full/vertical-header/VerticalHeader.vue b/dashboard/src/layouts/full/vertical-header/VerticalHeader.vue index f100aa2516..8287644b12 100644 --- a/dashboard/src/layouts/full/vertical-header/VerticalHeader.vue +++ b/dashboard/src/layouts/full/vertical-header/VerticalHeader.vue @@ -738,7 +738,7 @@ onMounted(async () => {
-
+

{{ t('core.header.updateDialog.commitHash.title') }}

{{ t('core.header.updateDialog.commitHash.description') }}
@@ -750,11 +750,11 @@ onMounted(async () => { variant="outlined" hide-details="auto" maxlength="40" - style="max-width: 420px; font-family: monospace;" + class="commit-hash-input" /> { font-size: 16px; } } + +.commit-hash-input { + max-width: 420px; + font-family: monospace; +} + +.commit-hash-btn { + border-radius: 10px; +} From 723d9098a2cf7b744b2b50a1544da159fb477f53 Mon Sep 17 00:00:00 2001 From: mzwing Date: Mon, 23 Mar 2026 02:31:08 +0800 Subject: [PATCH 5/5] chore(webui): use label for better accessibility --- dashboard/src/i18n/locales/en-US/core/header.json | 2 +- dashboard/src/i18n/locales/ru-RU/core/header.json | 2 +- dashboard/src/i18n/locales/zh-CN/core/header.json | 2 +- dashboard/src/layouts/full/vertical-header/VerticalHeader.vue | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/dashboard/src/i18n/locales/en-US/core/header.json b/dashboard/src/i18n/locales/en-US/core/header.json index 3591a175d7..a0921d0d04 100644 --- a/dashboard/src/i18n/locales/en-US/core/header.json +++ b/dashboard/src/i18n/locales/en-US/core/header.json @@ -50,7 +50,7 @@ "commitHash": { "title": "Update via Commit Hash", "description": "Enter a 40-character commit hash from the GitHub repository to install unreleased fixes and features.", - "placeholder": "Enter commit hash", + "label": "Enter commit hash", "install": "Install", "invalidFormat": "Please enter a valid 40-character hexadecimal commit hash" }, diff --git a/dashboard/src/i18n/locales/ru-RU/core/header.json b/dashboard/src/i18n/locales/ru-RU/core/header.json index f9dd1b5148..58b019a6af 100644 --- a/dashboard/src/i18n/locales/ru-RU/core/header.json +++ b/dashboard/src/i18n/locales/ru-RU/core/header.json @@ -50,7 +50,7 @@ "commitHash": { "title": "Обновление через Commit Hash", "description": "Введите 40-значный хеш фиксации из репозитория GitHub, чтобы установить невыпущенные исправления и функции.", - "placeholder": "Введите хеш фиксации", + "label": "Введите хеш фиксации", "install": "Установить", "invalidFormat": "Введите действительный 40-значный шестнадцатеричный хеш фиксации" }, diff --git a/dashboard/src/i18n/locales/zh-CN/core/header.json b/dashboard/src/i18n/locales/zh-CN/core/header.json index 39373bc8d5..e3bdc83721 100644 --- a/dashboard/src/i18n/locales/zh-CN/core/header.json +++ b/dashboard/src/i18n/locales/zh-CN/core/header.json @@ -50,7 +50,7 @@ "commitHash": { "title": "通过 Commit Hash 更新", "description": "输入 GitHub 仓库的 40 位 commit hash,可以安装尚未发布至正式版的修复和功能。", - "placeholder": "输入 commit hash", + "label": "输入 commit hash", "install": "安装", "invalidFormat": "请输入有效的 40 位十六进制 commit hash" }, diff --git a/dashboard/src/layouts/full/vertical-header/VerticalHeader.vue b/dashboard/src/layouts/full/vertical-header/VerticalHeader.vue index 8287644b12..d9d33550ad 100644 --- a/dashboard/src/layouts/full/vertical-header/VerticalHeader.vue +++ b/dashboard/src/layouts/full/vertical-header/VerticalHeader.vue @@ -744,7 +744,7 @@ onMounted(async () => {