+
-
+
{{ extension.author }} / {{ extension.name }}
-
- {{ extension.display_name?.length ? extension.display_name : extension.name }}
-
+
+ {{
+ extension.display_name?.length
+ ? extension.display_name
+ : extension.name
+ }}
+
-
+
- {{ tm("card.status.hasUpdate") }}: {{ extension.online_version }}
+ {{ tm("card.status.hasUpdate") }}:
+ {{ extension.online_version }}
-
+
-
+
{{ tm("card.status.disabled") }}
@@ -184,34 +283,58 @@ const viewReadme = () => {
{{ extension.version }}
-
+
{{ extension.online_version }}
-
+
- {{ extension.handlers?.length }}{{ tm("card.status.handlersCount") }}
+ {{ extension.handlers?.length
+ }}{{ tm("card.status.handlersCount") }}
-
- {{ tag === 'danger' ? tm('tags.danger') : tag }}
+
+ {{ tag === "danger" ? tm("tags.danger") : tag }}
-
-
- {{ tm('buttons.viewDocs') }}
+ {{ tm("buttons.viewDocs") }}
-
- {{ tm('card.actions.pluginConfig') }}
+
+ {{ tm("card.actions.pluginConfig") }}
@@ -221,7 +344,6 @@ const viewReadme = () => {
v-model="showUninstallDialog"
@confirm="handleUninstallConfirm"
/>
-
+ this.$emit("update:show", value);
+ },
+ },
+ },
+};
+
diff --git a/dashboard/src/i18n/locales/en-US/core/common.json b/dashboard/src/i18n/locales/en-US/core/common.json
index 70d545d21..a8c27bdc8 100644
--- a/dashboard/src/i18n/locales/en-US/core/common.json
+++ b/dashboard/src/i18n/locales/en-US/core/common.json
@@ -62,6 +62,14 @@
"subtitle": "Please check the extension marketplace or contact the extension author for more information."
}
},
+ "changelog": {
+ "title": "Changelog",
+ "loading": "Loading changelog...",
+ "empty": {
+ "title": "No changelog available for this plugin",
+ "subtitle": "Developers can add a CHANGELOG.md file in the plugin directory to provide changelog"
+ }
+ },
"editor": {
"fullscreen": "Fullscreen Edit",
"editingTitle": "Editing Content"
diff --git a/dashboard/src/i18n/locales/en-US/features/extension.json b/dashboard/src/i18n/locales/en-US/features/extension.json
index 275ff596d..94de58b97 100644
--- a/dashboard/src/i18n/locales/en-US/features/extension.json
+++ b/dashboard/src/i18n/locales/en-US/features/extension.json
@@ -212,5 +212,8 @@
"pairs": "command conflicts",
"goToManage": "Go to Manage",
"later": "Later"
+ },
+ "pluginChangelog": {
+ "menuTitle": "View Changelog"
}
-}
\ No newline at end of file
+}
diff --git a/dashboard/src/i18n/locales/zh-CN/core/common.json b/dashboard/src/i18n/locales/zh-CN/core/common.json
index 21ba41fab..4e1712f40 100644
--- a/dashboard/src/i18n/locales/zh-CN/core/common.json
+++ b/dashboard/src/i18n/locales/zh-CN/core/common.json
@@ -62,6 +62,14 @@
"subtitle": "请查看插件市场或联系插件作者获取更多信息。"
}
},
+ "changelog": {
+ "title": "更新日志",
+ "loading": "正在加载更新日志...",
+ "empty": {
+ "title": "该插件未提供更新日志",
+ "subtitle": "开发者可在插件目录下添加 CHANGELOG.md 文件来提供更新日志"
+ }
+ },
"editor": {
"fullscreen": "全屏编辑",
"editingTitle": "编辑内容"
diff --git a/dashboard/src/i18n/locales/zh-CN/features/extension.json b/dashboard/src/i18n/locales/zh-CN/features/extension.json
index e1c5a6c46..a493f575a 100644
--- a/dashboard/src/i18n/locales/zh-CN/features/extension.json
+++ b/dashboard/src/i18n/locales/zh-CN/features/extension.json
@@ -212,5 +212,8 @@
"pairs": "对指令冲突",
"goToManage": "前往处理",
"later": "稍后处理"
+ },
+ "pluginChangelog": {
+ "menuTitle": "查看更新日志"
}
}
diff --git a/dashboard/src/views/ExtensionPage.vue b/dashboard/src/views/ExtensionPage.vue
index 8406bcd95..4424c1254 100644
--- a/dashboard/src/views/ExtensionPage.vue
+++ b/dashboard/src/views/ExtensionPage.vue
@@ -1,35 +1,35 @@
@@ -939,94 +1012,161 @@ watch(isListView, (newVal) => {
-
+
mdi-puzzle
- {{ tm('tabs.installedPlugins') }}
+ {{ tm("tabs.installedPlugins") }}
mdi-server-network
- {{ tm('tabs.installedMcpServers') }}
+ {{ tm("tabs.installedMcpServers") }}
mdi-store
- {{ tm('tabs.market') }}
+ {{ tm("tabs.market") }}
mdi-wrench
- {{ tm('tabs.handlersOperation') }}
+ {{ tm("tabs.handlersOperation") }}
-
-
-
-
+
+
mdi-view-grid
-
+
mdi-view-list
- {{ showReserved ? 'mdi-eye-off' : 'mdi-eye' }}
- {{ showReserved ? tm('buttons.hideSystemPlugins') : tm('buttons.showSystemPlugins') }}
+ {{
+ showReserved ? "mdi-eye-off" : "mdi-eye"
+ }}
+ {{
+ showReserved
+ ? tm("buttons.hideSystemPlugins")
+ : tm("buttons.showSystemPlugins")
+ }}
-
+
mdi-update
- {{ tm('buttons.updateAll') }}
+ {{ tm("buttons.updateAll") }}
-
+
mdi-plus
- {{ tm('buttons.install') }}
+ {{ tm("buttons.install") }}
-
+
mdi-alert-circle
- mdi-alert-circle
- {{ tm('dialogs.error.title') }}
+ mdi-alert-circle
+ {{ tm("dialogs.error.title") }}
- {{ extension_data.message }}
- {{ tm('dialogs.error.checkConsole') }}
+
+ {{ extension_data.message }}
+
+
+ {{ tm("dialogs.error.checkConsole") }}
+
- {{ tm('buttons.close') }}
+ {{ tm("buttons.close") }}
@@ -1039,50 +1179,113 @@ watch(isListView, (newVal) => {
-
+
-
- {{ tm('status.loading') }}
+
+ {{ tm("status.loading") }}
-
-
![]()
+
+
-
-
![]()
+
+
- {{ item.display_name && item.display_name.length ? item.display_name : item.name }}
+ {{
+ item.display_name && item.display_name.length
+ ? item.display_name
+ : item.name
+ }}
-
+
{{ item.name }}
-
-
{{ tm('status.system')
- }}
+
+ {{ tm("status.system") }}
- {{ item.desc }}
+
+ {{ item.desc }}
+
{{ item.version }}
- mdi-alert
+ mdi-alert
- {{ tm('messages.hasUpdate') }} {{ item.online_version }}
+ {{ tm("messages.hasUpdate") }}
+ {{ item.online_version }}
@@ -1092,65 +1295,135 @@ watch(isListView, (newVal) => {
-
- {{ item.activated ? tm('status.enabled') : tm('status.disabled') }}
+
+ {{
+ item.activated
+ ? tm("status.enabled")
+ : tm("status.disabled")
+ }}
-
-
+
+
mdi-play
- {{ tm('tooltips.enable') }}
+ {{
+ tm("tooltips.enable")
+ }}
-
+
mdi-pause
- {{ tm('tooltips.disable') }}
+ {{
+ tm("tooltips.disable")
+ }}
-
+
mdi-refresh
- {{ tm('tooltips.reload') }}
+ {{
+ tm("tooltips.reload")
+ }}
-
+
mdi-cog
- {{ tm('tooltips.configure') }}
+ {{
+ tm("tooltips.configure")
+ }}
-
+
mdi-information
- {{ tm('tooltips.viewInfo') }}
+ {{
+ tm("tooltips.viewInfo")
+ }}
-
+
mdi-book-open-page-variant
- {{ tm('tooltips.viewDocs') }}
+ {{
+ tm("tooltips.viewDocs")
+ }}
-
+
mdi-update
- {{ tm('tooltips.update') }}
+ {{
+ tm("tooltips.update")
+ }}
-
+
mdi-delete
- {{ tm('tooltips.uninstall') }}
+ {{
+ tm("tooltips.uninstall")
+ }}
-
-
-
mdi-puzzle-outline
-
{{ tm('empty.noPlugins') }}
-
{{ tm('empty.noPluginsDesc') }}
+
mdi-puzzle-outline
+
+ {{ tm("empty.noPlugins") }}
+
+
+ {{ tm("empty.noPluginsDesc") }}
+
@@ -1161,22 +1434,44 @@ watch(isListView, (newVal) => {
- mdi-puzzle-outline
- {{ tm('empty.noPlugins') }}
- {{ tm('empty.noPluginsDesc') }}
+ mdi-puzzle-outline
+ {{ tm("empty.noPlugins") }}
+
+ {{ tm("empty.noPluginsDesc") }}
+
-
-
+ uninstallExtension(ext.name, options)"
- @update="updateExtension(extension.name)" @reload="reloadPlugin(extension.name)"
- @toggle-activation="extension.activated ? pluginOff(extension) : pluginOn(extension)"
- @view-handlers="showPluginInfo(extension)" @view-readme="viewReadme(extension)">
+ @uninstall="
+ (ext, options) => uninstallExtension(ext.name, options)
+ "
+ @update="updateExtension(extension.name)"
+ @reload="reloadPlugin(extension.name)"
+ @toggle-activation="
+ extension.activated
+ ? pluginOff(extension)
+ : pluginOn(extension)
+ "
+ @view-handlers="showPluginInfo(extension)"
+ @view-readme="viewReadme(extension)"
+ @view-changelog="viewChangelog(extension)"
+ >
@@ -1186,7 +1481,11 @@ watch(isListView, (newVal) => {
-
+
@@ -1195,7 +1494,11 @@ watch(isListView, (newVal) => {
-
+
@@ -1204,18 +1507,32 @@ watch(isListView, (newVal) => {
-
-
-
+
-
-
mdi-source-branch
-
- {{ tm('market.source') }}
+
+ mdi-source-branch
+
+ {{ tm("market.source") }}
-
+
{
:ripple="false"
height="32"
>
-
- {{ selectedSource ? customSources.find(s => s.url === selectedSource)?.name : tm('market.defaultSource') }}
+
+ {{
+ selectedSource
+ ? customSources.find(
+ (s) => s.url === selectedSource,
+ )?.name
+ : tm("market.defaultSource")
+ }}
- mdi-chevron-down
- {{ selectedSource || tm('market.defaultOfficialSource') }}
+ mdi-chevron-down
+ {{
+ selectedSource || tm("market.defaultOfficialSource")
+ }}
-
- {{ tm('market.availableSources') }}
-
+
+ {{ tm("market.availableSources") }}
+
{
:active="selectedSource === null"
>
-
+
- {{ tm('market.defaultSource') }}
+ {{
+ tm("market.defaultSource")
+ }}
-
-
+
+
{
color="primary"
:active="selectedSource === source.url"
>
-
-
+
+
{{ source.name }}
- {{ source.url }}
+ {{
+ source.url
+ }}
-
-
+
+
-
+
{
color="primary"
@click="addCustomSource"
>
-
+
- {
-
+
{
-
@@ -1329,55 +1685,108 @@ watch(isListView, (newVal) => {
-
+
-
-
-
{{ tm('market.allPlugins') }}({{ filteredMarketPlugins.length }})
-
+
+
+
+ {{ tm("market.allPlugins") }}({{
+ filteredMarketPlugins.length
+ }})
+
+
mdi-refresh
-
-
+
+
-
+
mdi-sort
-
- {{ sortOrder === 'desc' ? 'mdi-sort-descending' : 'mdi-sort-ascending'
+
+ {{
+ sortOrder === "desc"
+ ? "mdi-sort-descending"
+ : "mdi-sort-ascending"
}}
- {{ sortOrder === 'desc' ? tm('sort.descending') : tm('sort.ascending') }}
+ {{
+ sortOrder === "desc"
+ ? tm("sort.descending")
+ : tm("sort.ascending")
+ }}
-
+
🥳 推荐
-
-
![]()
+ style="
+ padding: 12px;
+ padding-bottom: 8px;
+ display: flex;
+ gap: 12px;
+ width: 100%;
+ flex: 1;
+ overflow: hidden;
+ "
+ >
+
+
-
+
-
-
- {{ plugin.display_name?.length ? plugin.display_name :
- (showPluginFullName ? plugin.name : plugin.trimmedName) }}
+
+
+ {{
+ plugin.display_name?.length
+ ? plugin.display_name
+ : showPluginFullName
+ ? plugin.name
+ : plugin.trimmedName
+ }}
-
-
-
-
+
+
+
{{ plugin.stars }}
-
-
-
{{ new Date(plugin.updated_at).toLocaleString() }}
+
+
+ {{
+ new Date(plugin.updated_at).toLocaleString()
+ }}
-
-
- {{ tag === 'danger' ? tm('tags.danger') : tag }}
+
+
+ {{ tag === "danger" ? tm("tags.danger") : tag }}
-
+
-
+
+{{ plugin.tags.length - 2 }}
-
-
- {{ tag === 'danger' ? tm('tags.danger') : tag }}
+
+
+ {{ tag === "danger" ? tm("tags.danger") : tag }}
-
+
仓库
-
- {{ tm('buttons.install') }}
+
+ {{ tm("buttons.install") }}
-
- ✓ {{ tm('status.installed') }}
+
+ ✓ {{ tm("status.installed") }}
@@ -1495,14 +2056,23 @@ watch(isListView, (newVal) => {
-
+
-
+
@@ -1519,9 +2089,15 @@ watch(isListView, (newVal) => {
color="primary"
class="text-none"
>
- {{ tm('market.devDocs') }}
+ {{ tm("market.devDocs") }}
-
+
{
color="primary"
class="text-none"
>
- {{ tm('market.submitRepo') }}
+ {{ tm("market.submitRepo") }}
@@ -1539,16 +2115,29 @@ watch(isListView, (newVal) => {
- {{ tm('dialogs.config.title') }}
+ {{
+ tm("dialogs.config.title")
+ }}
-
- {{ tm('dialogs.config.noConfig') }}
+
+ {{ tm("dialogs.config.noConfig") }}
- {{ tm('buttons.saveAndClose') }}
- {{ tm('buttons.close') }}
+ {{
+ tm("buttons.saveAndClose")
+ }}
+ {{ tm("buttons.close") }}
@@ -1557,20 +2146,34 @@ watch(isListView, (newVal) => {
{{ loadingDialog.title }}
-
-
+
+
-
+
{{ loadingDialog.result }}
-
-
{{ tm('dialogs.loading.logs') }}
-
+
+
{{ tm("dialogs.loading.logs") }}
+
@@ -1579,7 +2182,12 @@ watch(isListView, (newVal) => {
- {{ tm('buttons.close') }}
+ {{ tm("buttons.close") }}
@@ -1587,12 +2195,18 @@ watch(isListView, (newVal) => {
- {{ selectedPlugin.name }} {{ tm('buttons.viewInfo') }}
+ {{ selectedPlugin.name }} {{ tm("buttons.viewInfo") }}
-
+
- {{ column.title }}
+ {{ column.title }}
{{ item.event_type }}
@@ -1606,51 +2220,84 @@ watch(isListView, (newVal) => {
- {{ item.cmd }}
+ {{ item.cmd }}
- {{ tm('buttons.close')
- }}
+ {{ tm("buttons.close") }}
-
+
{{ snack_message }}
-
+
+
+
+
-
+
mdi-alert-circle
- {{ tm('conflicts.title') }}
+ {{ tm("conflicts.title") }}
-
+
{{ conflictDialog.count }}
- {{ tm('conflicts.pairs') }}
+ {{ tm("conflicts.pairs") }}
-
- {{ tm('conflicts.message') }}
+
+ {{ tm("conflicts.message") }}
- {{ tm('conflicts.later') }}
+ {{
+ tm("conflicts.later")
+ }}
- {{ tm('conflicts.goToManage') }}
+ {{ tm("conflicts.goToManage") }}
@@ -1661,18 +2308,18 @@ watch(isListView, (newVal) => {
mdi-alert-circle
- {{ tm('dialogs.danger_warning.title') }}
+ {{ tm("dialogs.danger_warning.title") }}
- {{ tm('dialogs.danger_warning.message') }}
+ {{ tm("dialogs.danger_warning.message") }}
- {{ tm('dialogs.danger_warning.cancel') }}
+ {{ tm("dialogs.danger_warning.cancel") }}
- {{ tm('dialogs.danger_warning.confirm') }}
+ {{ tm("dialogs.danger_warning.confirm") }}
@@ -1680,38 +2327,65 @@ watch(isListView, (newVal) => {
-
+
-
+
-
{{ tm('dialogs.install.title') }}
-
+
{{ tm("dialogs.install.title") }}
+
- {{ tm('dialogs.install.fromFile') }}
- {{ tm('dialogs.install.fromUrl') }}
+ {{ tm("dialogs.install.fromFile") }}
+ {{ tm("dialogs.install.fromUrl") }}
-
+
-
- {{ tm('buttons.selectFile') }}
+
+ {{ tm("buttons.selectFile") }}
- {{ tm('messages.supportedFormats') }}
+ {{ tm("messages.supportedFormats") }}
-
+
{{ upload_file.name }}
- ({{ (upload_file.size / 1024).toFixed(1) }}KB)
+ ({{ (upload_file.size / 1024).toFixed(1) }}KB)
@@ -1720,10 +2394,16 @@ watch(isListView, (newVal) => {
@@ -1732,8 +2412,12 @@ watch(isListView, (newVal) => {
- {{ tm('buttons.cancel') }}
- {{ tm('buttons.install') }}
+ {{
+ tm("buttons.cancel")
+ }}
+ {{
+ tm("buttons.install")
+ }}
@@ -1741,7 +2425,9 @@ watch(isListView, (newVal) => {
- {{ editingSource ? tm('market.editSource') : tm('market.addSource') }}
+ {{
+ editingSource ? tm("market.editSource") : tm("market.addSource")
+ }}
{
class="mb-4"
placeholder="我的插件源"
>
-
+
{
hide-details
placeholder="https://example.com/plugins.json"
>
-
+
- {{ tm('messages.enterJsonUrl') }}
+ {{ tm("messages.enterJsonUrl") }}
- {{ tm('buttons.cancel') }}
- {{ tm('buttons.save') }}
+ {{
+ tm("buttons.cancel")
+ }}
+ {{
+ tm("buttons.save")
+ }}
@@ -1781,10 +2471,10 @@ watch(isListView, (newVal) => {
mdi-alert-circle
- {{ tm('dialogs.uninstall.title') }}
+ {{ tm("dialogs.uninstall.title") }}
- {{ tm('market.confirmRemoveSource') }}
+ {{ tm("market.confirmRemoveSource") }}
{{ sourceToRemove.name }}
{{ sourceToRemove.url }}
@@ -1792,8 +2482,15 @@ watch(isListView, (newVal) => {
- {{ tm('buttons.cancel') }}
- {{ tm('buttons.deleteSource') }}
+ {{ tm("buttons.cancel") }}
+ {{
+ tm("buttons.deleteSource")
+ }}
@@ -1803,15 +2500,19 @@ watch(isListView, (newVal) => {
mdi-information-outline
- {{ tm('dialogs.forceUpdate.title') }}
+ {{ tm("dialogs.forceUpdate.title") }}
- {{ tm('dialogs.forceUpdate.message') }}
+ {{ tm("dialogs.forceUpdate.message") }}
- {{ tm('buttons.cancel') }}
- {{ tm('dialogs.forceUpdate.confirm') }}
+ {{
+ tm("buttons.cancel")
+ }}
+ {{
+ tm("dialogs.forceUpdate.confirm")
+ }}