From 291ab8a65e3af84494411f2f8950c302ae2a914d Mon Sep 17 00:00:00 2001 From: Raunak Raj <71929976+bajrangCoder@users.noreply.github.com> Date: Tue, 23 Jun 2026 16:22:07 +0530 Subject: [PATCH 1/5] feat: add language-mode plugin recommendation system --- src/lib/editorFile.js | 15 +++ src/lib/languageModeRecommendations.js | 164 +++++++++++++++++++++++++ src/lib/notificationManager.js | 19 +++ src/lib/settings.js | 1 + src/settings/editorSettings.js | 9 ++ src/sidebarApps/extensions/index.js | 86 ++++++++----- src/styles/notification.scss | 53 +++++++- 7 files changed, 316 insertions(+), 31 deletions(-) create mode 100644 src/lib/languageModeRecommendations.js diff --git a/src/lib/editorFile.js b/src/lib/editorFile.js index 9c89af17b..7a452d4c9 100644 --- a/src/lib/editorFile.js +++ b/src/lib/editorFile.js @@ -227,6 +227,20 @@ function createSessionProxy(state, file) { }); } +function maybeRecommendLanguageModeExtension(file, modeInfo) { + if (appSettings.value.recommendExtensions === false) return; + if (modeInfo?.name !== "text" || modeInfo.supportsFile(file.filename)) return; + + void import("./languageModeRecommendations").then( + ({ default: recommend }) => { + recommend(file, modeInfo); + }, + (error) => { + console.warn("Failed to load language mode recommendations.", error); + }, + ); +} + /** * @typedef {'run'|'save'|'change'|'focus'|'blur'|'close'|'rename'|'load'|'loadError'|'loadStart'|'loadEnd'|'changeMode'|'changeEncoding'|'changeReadOnly'} FileEvents */ @@ -1295,6 +1309,7 @@ export default class EditorFile { // Store mode info for later use when creating editor view this.currentMode = mode; this.currentLanguageExtension = modeInfo?.getExtension() || null; + maybeRecommendLanguageModeExtension(this, modeInfo); // sets file icon this.#tab.lead( diff --git a/src/lib/languageModeRecommendations.js b/src/lib/languageModeRecommendations.js new file mode 100644 index 000000000..581413843 --- /dev/null +++ b/src/lib/languageModeRecommendations.js @@ -0,0 +1,164 @@ +import notificationManager from "lib/notificationManager"; +import Path from "utils/Path"; +import Url from "utils/Url"; +import config from "./config"; + +let instance = null; + +function withSupportedEditor(url) { + const separator = url.includes("?") ? "&" : "?"; + return `${url}${separator}supported_editor=${config.SUPPORTED_EDITOR}`; +} + +function getSearchKeyword(filename) { + const ext = Path.extname(filename || "") + .replace(/^\./, "") + .trim() + .toLowerCase(); + + if (!/^[a-z0-9][a-z0-9._+-]*$/.test(ext)) return ""; + + return ext; +} + +function getIssueUrl(keyword) { + const params = new URLSearchParams({ + template: "1_feature_request.yml", + labels: "new plugin idea,enhancement", + title: `Plugin request: ${keyword} syntax highlighting`, + }); + + return `${config.GITHUB_URL}/issues/new?${params}`; +} + +function formatString(value, replacements) { + return String(value || "").replace(/\{(\w+)\}/g, (_, key) => { + return replacements[key] ?? ""; + }); +} + +async function openUrl(url) { + if (window.cordova?.exec) { + const { default: customTab } = await import("./customTab"); + await customTab(url); + return; + } + + window.open(url, "_blank", "noopener,noreferrer"); +} + +async function openExtensions(keyword) { + const { openWithSearch } = await import("sidebarApps/extensions"); + openWithSearch(keyword); +} + +function hasPlainTextFallback(modeInfo, filename) { + return modeInfo?.name === "text" && !modeInfo.supportsFile(filename); +} + +class LanguageModeRecommendations { + notifiedKeywords = new Set(); + availabilityCache = new Map(); + + async getPluginAvailability(keyword) { + if (this.availabilityCache.has(keyword)) { + return this.availabilityCache.get(keyword); + } + + const availability = fetch( + withSupportedEditor( + Url.join( + config.API_BASE, + `plugins?name=${encodeURIComponent(keyword)}`, + ), + ), + ) + .then((response) => response.json()) + .then((plugins) => Array.isArray(plugins) && plugins.length > 0) + .catch(() => true); + + this.availabilityCache.set(keyword, availability); + return availability; + } + + recommend(file, modeInfo) { + if (!file || file.type !== "editor") return; + + const filename = file.filename || ""; + if (!hasPlainTextFallback(modeInfo, filename)) return; + + const keyword = getSearchKeyword(filename); + if (!keyword || this.notifiedKeywords.has(keyword)) return; + + this.notifiedKeywords.add(keyword); + + void this.showRecommendation(keyword); + } + + async showRecommendation(keyword) { + const hasPlugins = await this.getPluginAvailability(keyword); + const displayExt = `.${keyword}`; + + if (hasPlugins) { + notificationManager.pushNotification({ + title: formatString( + strings["extension recommendation title"] || + "Extensions available for {extension}", + { extension: displayExt, keyword }, + ), + message: formatString( + strings["extension recommendation message"] || + 'No syntax mode is installed for {extension}. Search plugins for "{keyword}".', + { extension: displayExt, keyword }, + ), + icon: "extension", + type: "info", + action: () => openExtensions(keyword), + actions: [ + { + text: strings["search plugins"] || "Search plugins", + icon: "search", + action: () => openExtensions(keyword), + }, + ], + }); + return; + } + + const issueUrl = getIssueUrl(keyword); + notificationManager.pushNotification({ + title: formatString( + strings["extension request title"] || + "No extension found for {extension}", + { extension: displayExt, keyword }, + ), + message: formatString( + strings["extension request message"] || + "Ask for a plugin so Acode can highlight this file type.", + { extension: displayExt, keyword }, + ), + icon: "extension", + type: "warning", + action: () => openUrl(issueUrl), + actions: [ + { + text: strings["request plugin"] || "Request plugin", + icon: "open_in_new", + action: () => openUrl(issueUrl), + }, + ], + }); + } +} + +function getLanguageModeRecommendations() { + if (!instance) { + instance = new LanguageModeRecommendations(); + } + + return instance; +} + +export default function recommendLanguageModeExtension(file, modeInfo) { + getLanguageModeRecommendations().recommend(file, modeInfo); +} diff --git a/src/lib/notificationManager.js b/src/lib/notificationManager.js index 56ffee4b9..0a4bde492 100644 --- a/src/lib/notificationManager.js +++ b/src/lib/notificationManager.js @@ -12,6 +12,7 @@ import Ref from "html-tag-js/ref"; * @prop {number} [props.time] * @prop {(notification: NotificationProps) => void} [props.action] * @prop {(notification: NotificationProps) => void} [props.onDismiss] + * @prop {{text:string, icon?:string, action:(notification: NotificationProps) => void}[]} [props.actions] * @prop {() => number} [props.progress] * @prop {() => loading} [props.loading = false] * @prop {"info"|"success"|"warning"|"error"} [props.type] @@ -200,6 +201,24 @@ class NotificationManager { />
{safeMessage}
+ {Array.isArray(notification.actions) && + notification.actions.length > 0 && ( +
+ {notification.actions.map((action) => ( + + ))} +
+ )} ); } diff --git a/src/lib/settings.js b/src/lib/settings.js index 1e63af9af..959b60986 100644 --- a/src/lib/settings.js +++ b/src/lib/settings.js @@ -152,6 +152,7 @@ class Settings { liveAutoCompletion: true, localWordCompletion: true, languageCompletion: true, + recommendExtensions: true, useEmmet: true, autoIndent: true, codeFolding: true, diff --git a/src/settings/editorSettings.js b/src/settings/editorSettings.js index 2ee5b0b46..5c8843930 100644 --- a/src/settings/editorSettings.js +++ b/src/settings/editorSettings.js @@ -140,6 +140,15 @@ export default function editorSettings() { info: strings["settings-info-editor-language-completion"], category: categories.assistance, }, + { + key: "recommendExtensions", + text: strings["recommend extensions"] || "Recommend extensions", + checkbox: values.recommendExtensions ?? true, + info: + strings["settings-info-editor-recommend-extensions"] || + "Suggest plugins when a file opens as plain text because no language mode is available.", + category: categories.assistance, + }, { key: "useEmmet", text: strings["use emmet"], diff --git a/src/sidebarApps/extensions/index.js b/src/sidebarApps/extensions/index.js index 07e14cc8a..7d7d7d756 100644 --- a/src/sidebarApps/extensions/index.js +++ b/src/sidebarApps/extensions/index.js @@ -214,40 +214,66 @@ async function loadFilteredPlugins(filterState, isInitial = false) { async function searchPlugin() { clearTimeout(searchTimeout); searchTimeout = setTimeout(async () => { - // Clear filter when searching - currentFilter = null; - filterHasMore = true; - isFilterLoading = false; - $searchResult.onscroll = null; + await runSearch(this.value); + }, 500); +} - $searchResult.content = ""; - const status = await helpers.checkAPIStatus(); - if (!status) { - $searchResult.content = ( - {strings.api_error} - ); - return; - } +async function runSearch(query) { + // Clear filter when searching + currentFilter = null; + filterHasMore = true; + isFilterLoading = false; + $searchResult.onscroll = null; - const query = this.value; - if (!query) return; + $searchResult.content = ""; + const status = await helpers.checkAPIStatus(); + if (!status) { + $searchResult.content = {strings.api_error}; + return; + } - try { - $searchResult.classList.add("loading"); - const plugins = await fsOperation( - withSupportedEditor(Url.join(config.API_BASE, `plugins?name=${query}`)), - ).readFile("json"); + query = String(query || "").trim(); + if (!query) return; - installedPlugins = await listInstalledPlugins(); - $searchResult.content = plugins.map(ListItem); - updateHeight($searchResult); - } catch (error) { - window.log("error", error); - $searchResult.content = {strings.error}; - } finally { - $searchResult.classList.remove("loading"); - } - }, 500); + try { + $searchResult.classList.add("loading"); + const plugins = await fsOperation( + withSupportedEditor( + Url.join(config.API_BASE, `plugins?name=${encodeURIComponent(query)}`), + ), + ).readFile("json"); + + installedPlugins = await listInstalledPlugins(); + $searchResult.content = plugins.length ? ( + plugins.map(ListItem) + ) : ( + + {strings["no plugins found"] || strings.empty || "No plugins found"} + + ); + updateHeight($searchResult); + } catch (error) { + window.log("error", error); + $searchResult.content = {strings.error}; + } finally { + $searchResult.classList.remove("loading"); + } +} + +export function openWithSearch(query) { + Sidebar.show(); + document + .querySelector('[data-action="sidebar-app"][data-id="extensions"]') + ?.click(); + + if (!container) return; + + const searchInput = container.querySelector('input[name="search-ext"]'); + if (!searchInput) return; + + searchInput.value = query; + clearTimeout(searchTimeout); + void runSearch(query); } async function filterPlugins() { diff --git a/src/styles/notification.scss b/src/styles/notification.scss index 80c5b4844..a931e81d3 100644 --- a/src/styles/notification.scss +++ b/src/styles/notification.scss @@ -69,6 +69,57 @@ hyphens: auto; } + .notification-actions { + display: flex; + flex-wrap: wrap; + justify-content: flex-end; + gap: 6px; + width: 100%; + margin-top: -2px; + } + + .notification-action { + display: inline-flex; + align-items: center; + justify-content: center; + gap: 5px; + min-height: 28px; + max-width: 100%; + padding: 0 9px; + border: 1px solid color-mix(in srgb, var(--button-background-color) 45%, transparent); + border-radius: 5px; + color: var(--button-background-color); + background: color-mix(in srgb, var(--button-background-color) 9%, transparent); + font-size: 12px; + font-weight: 500; + line-height: 1.2; + transition: + background-color 0.2s ease, + border-color 0.2s ease, + transform 0.2s ease; + + &:active { + transform: scale(0.98); + } + + &:focus-visible { + outline: 2px solid color-mix(in srgb, var(--button-background-color) 40%, transparent); + outline-offset: 2px; + } + + .icon { + font-size: 14px; + flex-shrink: 0; + } + + span:not(.icon) { + min-width: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + } + &.hiding { transform: translateX(120%); opacity: 0; @@ -91,4 +142,4 @@ color: var(--error-color); } } -} \ No newline at end of file +} From d7fb36c5f221287c918247b75f66f23ee0a1831a Mon Sep 17 00:00:00 2001 From: Raunak Raj <71929976+bajrangCoder@users.noreply.github.com> Date: Tue, 23 Jun 2026 16:26:12 +0530 Subject: [PATCH 2/5] translation strings --- src/lang/ar-ye.json | 10 ++++++- src/lang/be-by.json | 10 ++++++- src/lang/bn-bd.json | 10 ++++++- src/lang/cs-cz.json | 10 ++++++- src/lang/de-de.json | 10 ++++++- src/lang/en-us.json | 8 ++++++ src/lang/es-sv.json | 10 ++++++- src/lang/fr-fr.json | 10 ++++++- src/lang/he-il.json | 10 ++++++- src/lang/hi-in.json | 10 ++++++- src/lang/hu-hu.json | 10 ++++++- src/lang/id-id.json | 10 ++++++- src/lang/index.d.ts | 8 ++++++ src/lang/ir-fa.json | 10 ++++++- src/lang/it-it.json | 10 ++++++- src/lang/ja-jp.json | 10 ++++++- src/lang/ko-kr.json | 10 ++++++- src/lang/ml-in.json | 10 ++++++- src/lang/mm-unicode.json | 10 ++++++- src/lang/mm-zawgyi.json | 10 ++++++- src/lang/pl-pl.json | 10 ++++++- src/lang/pt-br.json | 10 ++++++- src/lang/pu-in.json | 10 ++++++- src/lang/ru-ru.json | 10 ++++++- src/lang/tl-ph.json | 10 ++++++- src/lang/tr-tr.json | 10 ++++++- src/lang/uk-ua.json | 10 ++++++- src/lang/uz-uz.json | 10 ++++++- src/lang/vi-vn.json | 10 ++++++- src/lang/zh-cn.json | 10 ++++++- src/lang/zh-hant.json | 10 ++++++- src/lang/zh-tw.json | 10 ++++++- src/lib/languageModeRecommendations.js | 40 ++++++++++++-------------- src/settings/editorSettings.js | 6 ++-- 34 files changed, 306 insertions(+), 56 deletions(-) diff --git a/src/lang/ar-ye.json b/src/lang/ar-ye.json index bf8a65fe3..afae38b27 100644 --- a/src/lang/ar-ye.json +++ b/src/lang/ar-ye.json @@ -766,5 +766,13 @@ "off": "إيقاف", "quick tools height": "ارتفاع الأدوات السريعة", "quick tools toggler": "مبدل الأدوات السريعة", - "running processes": "Running processes" + "running processes": "Running processes", + "recommend extensions": "Recommend extensions", + "settings-info-editor-recommend-extensions": "Suggest plugins when a file opens as plain text because no language mode is available.", + "extension recommendation title": "Extensions available for {extension}", + "extension recommendation message": "No syntax mode is installed for {extension}. Search plugins for \"{keyword}\".", + "extension request title": "No extension found for {extension}", + "extension request message": "Ask for a plugin so Acode can highlight this file type.", + "search plugins": "Search plugins", + "request plugin": "Request plugin" } diff --git a/src/lang/be-by.json b/src/lang/be-by.json index d42171d25..4b0231f85 100644 --- a/src/lang/be-by.json +++ b/src/lang/be-by.json @@ -766,5 +766,13 @@ "off": "Выкл", "quick tools height": "Вышыня хуткіх інструментаў", "quick tools toggler": "Пераключальнік хуткіх інструментаў", - "running processes": "Running processes" + "running processes": "Running processes", + "recommend extensions": "Recommend extensions", + "settings-info-editor-recommend-extensions": "Suggest plugins when a file opens as plain text because no language mode is available.", + "extension recommendation title": "Extensions available for {extension}", + "extension recommendation message": "No syntax mode is installed for {extension}. Search plugins for \"{keyword}\".", + "extension request title": "No extension found for {extension}", + "extension request message": "Ask for a plugin so Acode can highlight this file type.", + "search plugins": "Search plugins", + "request plugin": "Request plugin" } diff --git a/src/lang/bn-bd.json b/src/lang/bn-bd.json index aadf268e6..336254fcf 100644 --- a/src/lang/bn-bd.json +++ b/src/lang/bn-bd.json @@ -766,5 +766,13 @@ "off": "বন্ধ", "quick tools height": "কুইক টুলসের উচ্চতা", "quick tools toggler": "কুইক টুলস টগলার", - "running processes": "Running processes" + "running processes": "Running processes", + "recommend extensions": "Recommend extensions", + "settings-info-editor-recommend-extensions": "Suggest plugins when a file opens as plain text because no language mode is available.", + "extension recommendation title": "Extensions available for {extension}", + "extension recommendation message": "No syntax mode is installed for {extension}. Search plugins for \"{keyword}\".", + "extension request title": "No extension found for {extension}", + "extension request message": "Ask for a plugin so Acode can highlight this file type.", + "search plugins": "Search plugins", + "request plugin": "Request plugin" } diff --git a/src/lang/cs-cz.json b/src/lang/cs-cz.json index c6f14f300..b67c86c6e 100644 --- a/src/lang/cs-cz.json +++ b/src/lang/cs-cz.json @@ -766,5 +766,13 @@ "off": "Vypnuto", "quick tools height": "Výška rychlých nástrojů", "quick tools toggler": "Přepínač rychlých nástrojů", - "running processes": "Running processes" + "running processes": "Running processes", + "recommend extensions": "Recommend extensions", + "settings-info-editor-recommend-extensions": "Suggest plugins when a file opens as plain text because no language mode is available.", + "extension recommendation title": "Extensions available for {extension}", + "extension recommendation message": "No syntax mode is installed for {extension}. Search plugins for \"{keyword}\".", + "extension request title": "No extension found for {extension}", + "extension request message": "Ask for a plugin so Acode can highlight this file type.", + "search plugins": "Search plugins", + "request plugin": "Request plugin" } diff --git a/src/lang/de-de.json b/src/lang/de-de.json index fede78c8d..a7eb71834 100644 --- a/src/lang/de-de.json +++ b/src/lang/de-de.json @@ -766,5 +766,13 @@ "off": "Aus", "quick tools height": "Schnellwerkzeug-Höhe", "quick tools toggler": "Schnellwerkzeug-Schaltfläche", - "running processes": "Running processes" + "running processes": "Running processes", + "recommend extensions": "Recommend extensions", + "settings-info-editor-recommend-extensions": "Suggest plugins when a file opens as plain text because no language mode is available.", + "extension recommendation title": "Extensions available for {extension}", + "extension recommendation message": "No syntax mode is installed for {extension}. Search plugins for \"{keyword}\".", + "extension request title": "No extension found for {extension}", + "extension request message": "Ask for a plugin so Acode can highlight this file type.", + "search plugins": "Search plugins", + "request plugin": "Request plugin" } diff --git a/src/lang/en-us.json b/src/lang/en-us.json index 94c4fb595..f1d18c0b1 100644 --- a/src/lang/en-us.json +++ b/src/lang/en-us.json @@ -136,6 +136,7 @@ "live autocompletion": "Live autocompletion", "local word completion": "Local word completion", "language package completion": "Language package completion", + "recommend extensions": "Recommend extensions", "auto close tags": "Auto close tags", "auto rename tags": "Auto rename tags", "file properties": "File properties", @@ -689,6 +690,13 @@ "settings-info-editor-live-autocomplete": "Show suggestions while you type.", "settings-info-editor-local-word-completion": "Suggest words from the current file.", "settings-info-editor-language-completion": "Suggest keywords, snippets, and other completions from CodeMirror language packages.", + "settings-info-editor-recommend-extensions": "Suggest plugins when a file opens as plain text because no language mode is available.", + "extension recommendation title": "Extensions available for {extension}", + "extension recommendation message": "No syntax mode is installed for {extension}. Search plugins for \"{keyword}\".", + "extension request title": "No extension found for {extension}", + "extension request message": "Ask for a plugin so Acode can highlight this file type.", + "search plugins": "Search plugins", + "request plugin": "Request plugin", "settings-info-editor-auto-close-tags": "Automatically insert closing tags in HTML, XML, Vue, Angular, and PHP template files.", "settings-info-editor-auto-rename-tags": "Rename the matching opening or closing tag while editing HTML-like tags.", "settings-info-editor-rainbow-brackets": "Color matching brackets by nesting depth.", diff --git a/src/lang/es-sv.json b/src/lang/es-sv.json index e4e74e7ba..4d28b63c3 100644 --- a/src/lang/es-sv.json +++ b/src/lang/es-sv.json @@ -766,5 +766,13 @@ "off": "Apagado", "quick tools height": "Altura de herramientas rápidas", "quick tools toggler": "Alternador de herramientas rápidas", - "running processes": "Running processes" + "running processes": "Running processes", + "recommend extensions": "Recommend extensions", + "settings-info-editor-recommend-extensions": "Suggest plugins when a file opens as plain text because no language mode is available.", + "extension recommendation title": "Extensions available for {extension}", + "extension recommendation message": "No syntax mode is installed for {extension}. Search plugins for \"{keyword}\".", + "extension request title": "No extension found for {extension}", + "extension request message": "Ask for a plugin so Acode can highlight this file type.", + "search plugins": "Search plugins", + "request plugin": "Request plugin" } diff --git a/src/lang/fr-fr.json b/src/lang/fr-fr.json index 14e9149b6..2ef49b793 100644 --- a/src/lang/fr-fr.json +++ b/src/lang/fr-fr.json @@ -766,5 +766,13 @@ "off": "Désactivé", "quick tools height": "Hauteur des outils rapides", "quick tools toggler": "Bascule des outils rapides", - "running processes": "Running processes" + "running processes": "Running processes", + "recommend extensions": "Recommend extensions", + "settings-info-editor-recommend-extensions": "Suggest plugins when a file opens as plain text because no language mode is available.", + "extension recommendation title": "Extensions available for {extension}", + "extension recommendation message": "No syntax mode is installed for {extension}. Search plugins for \"{keyword}\".", + "extension request title": "No extension found for {extension}", + "extension request message": "Ask for a plugin so Acode can highlight this file type.", + "search plugins": "Search plugins", + "request plugin": "Request plugin" } diff --git a/src/lang/he-il.json b/src/lang/he-il.json index 8007eabde..a3f07262a 100644 --- a/src/lang/he-il.json +++ b/src/lang/he-il.json @@ -766,5 +766,13 @@ "off": "כבוי", "quick tools height": "גובה כלים מהירים", "quick tools toggler": "מחליף כלים מהירים", - "running processes": "Running processes" + "running processes": "Running processes", + "recommend extensions": "Recommend extensions", + "settings-info-editor-recommend-extensions": "Suggest plugins when a file opens as plain text because no language mode is available.", + "extension recommendation title": "Extensions available for {extension}", + "extension recommendation message": "No syntax mode is installed for {extension}. Search plugins for \"{keyword}\".", + "extension request title": "No extension found for {extension}", + "extension request message": "Ask for a plugin so Acode can highlight this file type.", + "search plugins": "Search plugins", + "request plugin": "Request plugin" } diff --git a/src/lang/hi-in.json b/src/lang/hi-in.json index 4fa22c5d3..b45d02154 100644 --- a/src/lang/hi-in.json +++ b/src/lang/hi-in.json @@ -766,5 +766,13 @@ "off": "बंद", "quick tools height": "त्वरित उपकरण ऊंचाई", "quick tools toggler": "त्वरित उपकरण टॉगलर", - "running processes": "Running processes" + "running processes": "Running processes", + "recommend extensions": "Recommend extensions", + "settings-info-editor-recommend-extensions": "Suggest plugins when a file opens as plain text because no language mode is available.", + "extension recommendation title": "Extensions available for {extension}", + "extension recommendation message": "No syntax mode is installed for {extension}. Search plugins for \"{keyword}\".", + "extension request title": "No extension found for {extension}", + "extension request message": "Ask for a plugin so Acode can highlight this file type.", + "search plugins": "Search plugins", + "request plugin": "Request plugin" } diff --git a/src/lang/hu-hu.json b/src/lang/hu-hu.json index 3627e1d2b..941ef882e 100644 --- a/src/lang/hu-hu.json +++ b/src/lang/hu-hu.json @@ -766,5 +766,13 @@ "off": "Kikapcsolva", "quick tools height": "Gyorseszközök magassága", "quick tools toggler": "Gyorseszközök be/ki", - "running processes": "Running processes" + "running processes": "Running processes", + "recommend extensions": "Recommend extensions", + "settings-info-editor-recommend-extensions": "Suggest plugins when a file opens as plain text because no language mode is available.", + "extension recommendation title": "Extensions available for {extension}", + "extension recommendation message": "No syntax mode is installed for {extension}. Search plugins for \"{keyword}\".", + "extension request title": "No extension found for {extension}", + "extension request message": "Ask for a plugin so Acode can highlight this file type.", + "search plugins": "Search plugins", + "request plugin": "Request plugin" } diff --git a/src/lang/id-id.json b/src/lang/id-id.json index 7c6642680..cda838d34 100644 --- a/src/lang/id-id.json +++ b/src/lang/id-id.json @@ -766,5 +766,13 @@ "off": "Mati", "quick tools height": "Tinggi alat cepat", "quick tools toggler": "Pengalih alat cepat", - "running processes": "Proses yang berjalan" + "running processes": "Proses yang berjalan", + "recommend extensions": "Recommend extensions", + "settings-info-editor-recommend-extensions": "Suggest plugins when a file opens as plain text because no language mode is available.", + "extension recommendation title": "Extensions available for {extension}", + "extension recommendation message": "No syntax mode is installed for {extension}. Search plugins for \"{keyword}\".", + "extension request title": "No extension found for {extension}", + "extension request message": "Ask for a plugin so Acode can highlight this file type.", + "search plugins": "Search plugins", + "request plugin": "Request plugin" } diff --git a/src/lang/index.d.ts b/src/lang/index.d.ts index fec355f62..d29eaabf5 100644 --- a/src/lang/index.d.ts +++ b/src/lang/index.d.ts @@ -139,6 +139,7 @@ declare type LangStrings = { "live autocompletion": string; "local word completion": string; "language package completion": string; + "recommend extensions": string; "auto close tags": string; "auto rename tags": string; "file properties": string; @@ -692,6 +693,13 @@ declare type LangStrings = { "settings-info-editor-live-autocomplete": string; "settings-info-editor-local-word-completion": string; "settings-info-editor-language-completion": string; + "settings-info-editor-recommend-extensions": string; + "extension recommendation title": string; + "extension recommendation message": string; + "extension request title": string; + "extension request message": string; + "search plugins": string; + "request plugin": string; "settings-info-editor-auto-close-tags": string; "settings-info-editor-auto-rename-tags": string; "settings-info-editor-rainbow-brackets": string; diff --git a/src/lang/ir-fa.json b/src/lang/ir-fa.json index f4785142b..395c351bb 100644 --- a/src/lang/ir-fa.json +++ b/src/lang/ir-fa.json @@ -766,5 +766,13 @@ "off": "خاموش", "quick tools height": "ارتفاع ابزار سریع", "quick tools toggler": "تغییر دهنده ابزار سریع", - "running processes": "Running processes" + "running processes": "Running processes", + "recommend extensions": "Recommend extensions", + "settings-info-editor-recommend-extensions": "Suggest plugins when a file opens as plain text because no language mode is available.", + "extension recommendation title": "Extensions available for {extension}", + "extension recommendation message": "No syntax mode is installed for {extension}. Search plugins for \"{keyword}\".", + "extension request title": "No extension found for {extension}", + "extension request message": "Ask for a plugin so Acode can highlight this file type.", + "search plugins": "Search plugins", + "request plugin": "Request plugin" } diff --git a/src/lang/it-it.json b/src/lang/it-it.json index 8ab2b1f8a..a71320d5b 100644 --- a/src/lang/it-it.json +++ b/src/lang/it-it.json @@ -766,5 +766,13 @@ "off": "Spento", "quick tools height": "Altezza strumenti veloci", "quick tools toggler": "Attivatore strumenti veloci", - "running processes": "Running processes" + "running processes": "Running processes", + "recommend extensions": "Recommend extensions", + "settings-info-editor-recommend-extensions": "Suggest plugins when a file opens as plain text because no language mode is available.", + "extension recommendation title": "Extensions available for {extension}", + "extension recommendation message": "No syntax mode is installed for {extension}. Search plugins for \"{keyword}\".", + "extension request title": "No extension found for {extension}", + "extension request message": "Ask for a plugin so Acode can highlight this file type.", + "search plugins": "Search plugins", + "request plugin": "Request plugin" } diff --git a/src/lang/ja-jp.json b/src/lang/ja-jp.json index 990b15421..5ef721bba 100644 --- a/src/lang/ja-jp.json +++ b/src/lang/ja-jp.json @@ -766,5 +766,13 @@ "off": "オフ", "quick tools height": "クイックツールの高さ", "quick tools toggler": "クイックツール切替", - "running processes": "Running processes" + "running processes": "Running processes", + "recommend extensions": "Recommend extensions", + "settings-info-editor-recommend-extensions": "Suggest plugins when a file opens as plain text because no language mode is available.", + "extension recommendation title": "Extensions available for {extension}", + "extension recommendation message": "No syntax mode is installed for {extension}. Search plugins for \"{keyword}\".", + "extension request title": "No extension found for {extension}", + "extension request message": "Ask for a plugin so Acode can highlight this file type.", + "search plugins": "Search plugins", + "request plugin": "Request plugin" } diff --git a/src/lang/ko-kr.json b/src/lang/ko-kr.json index 738fff95d..8b98f9db0 100644 --- a/src/lang/ko-kr.json +++ b/src/lang/ko-kr.json @@ -766,5 +766,13 @@ "off": "끄기", "quick tools height": "퀵툴 높이", "quick tools toggler": "퀵툴 토글러", - "running processes": "Running processes" + "running processes": "Running processes", + "recommend extensions": "Recommend extensions", + "settings-info-editor-recommend-extensions": "Suggest plugins when a file opens as plain text because no language mode is available.", + "extension recommendation title": "Extensions available for {extension}", + "extension recommendation message": "No syntax mode is installed for {extension}. Search plugins for \"{keyword}\".", + "extension request title": "No extension found for {extension}", + "extension request message": "Ask for a plugin so Acode can highlight this file type.", + "search plugins": "Search plugins", + "request plugin": "Request plugin" } diff --git a/src/lang/ml-in.json b/src/lang/ml-in.json index ab55e327d..9b9d1d804 100644 --- a/src/lang/ml-in.json +++ b/src/lang/ml-in.json @@ -766,5 +766,13 @@ "off": "ഓഫ്", "quick tools height": "ദ്രുത ഉപകരണ ഉയരം", "quick tools toggler": "ദ്രുത ഉപകരണ ടോഗ്ലർ", - "running processes": "Running processes" + "running processes": "Running processes", + "recommend extensions": "Recommend extensions", + "settings-info-editor-recommend-extensions": "Suggest plugins when a file opens as plain text because no language mode is available.", + "extension recommendation title": "Extensions available for {extension}", + "extension recommendation message": "No syntax mode is installed for {extension}. Search plugins for \"{keyword}\".", + "extension request title": "No extension found for {extension}", + "extension request message": "Ask for a plugin so Acode can highlight this file type.", + "search plugins": "Search plugins", + "request plugin": "Request plugin" } diff --git a/src/lang/mm-unicode.json b/src/lang/mm-unicode.json index 18992b935..005ead025 100644 --- a/src/lang/mm-unicode.json +++ b/src/lang/mm-unicode.json @@ -766,5 +766,13 @@ "off": "Off", "quick tools height": "Quick tools height", "quick tools toggler": "Quick tools toggler", - "running processes": "Running processes" + "running processes": "Running processes", + "recommend extensions": "Recommend extensions", + "settings-info-editor-recommend-extensions": "Suggest plugins when a file opens as plain text because no language mode is available.", + "extension recommendation title": "Extensions available for {extension}", + "extension recommendation message": "No syntax mode is installed for {extension}. Search plugins for \"{keyword}\".", + "extension request title": "No extension found for {extension}", + "extension request message": "Ask for a plugin so Acode can highlight this file type.", + "search plugins": "Search plugins", + "request plugin": "Request plugin" } diff --git a/src/lang/mm-zawgyi.json b/src/lang/mm-zawgyi.json index 9320281e0..c9d53ee74 100644 --- a/src/lang/mm-zawgyi.json +++ b/src/lang/mm-zawgyi.json @@ -766,5 +766,13 @@ "off": "Off", "quick tools height": "Quick tools height", "quick tools toggler": "Quick tools toggler", - "running processes": "Running processes" + "running processes": "Running processes", + "recommend extensions": "Recommend extensions", + "settings-info-editor-recommend-extensions": "Suggest plugins when a file opens as plain text because no language mode is available.", + "extension recommendation title": "Extensions available for {extension}", + "extension recommendation message": "No syntax mode is installed for {extension}. Search plugins for \"{keyword}\".", + "extension request title": "No extension found for {extension}", + "extension request message": "Ask for a plugin so Acode can highlight this file type.", + "search plugins": "Search plugins", + "request plugin": "Request plugin" } diff --git a/src/lang/pl-pl.json b/src/lang/pl-pl.json index c46bd1766..2eb3f852a 100644 --- a/src/lang/pl-pl.json +++ b/src/lang/pl-pl.json @@ -766,5 +766,13 @@ "off": "Wyłączone", "quick tools height": "Wysokość szybkich narzędzi", "quick tools toggler": "Przełącznik szybkich narzędzi", - "running processes": "Running processes" + "running processes": "Running processes", + "recommend extensions": "Recommend extensions", + "settings-info-editor-recommend-extensions": "Suggest plugins when a file opens as plain text because no language mode is available.", + "extension recommendation title": "Extensions available for {extension}", + "extension recommendation message": "No syntax mode is installed for {extension}. Search plugins for \"{keyword}\".", + "extension request title": "No extension found for {extension}", + "extension request message": "Ask for a plugin so Acode can highlight this file type.", + "search plugins": "Search plugins", + "request plugin": "Request plugin" } diff --git a/src/lang/pt-br.json b/src/lang/pt-br.json index fd6a55183..065da232e 100644 --- a/src/lang/pt-br.json +++ b/src/lang/pt-br.json @@ -766,5 +766,13 @@ "off": "Desligado", "quick tools height": "Altura das ferramentas rápidas", "quick tools toggler": "Alternador de ferramentas rápidas", - "running processes": "Running processes" + "running processes": "Running processes", + "recommend extensions": "Recommend extensions", + "settings-info-editor-recommend-extensions": "Suggest plugins when a file opens as plain text because no language mode is available.", + "extension recommendation title": "Extensions available for {extension}", + "extension recommendation message": "No syntax mode is installed for {extension}. Search plugins for \"{keyword}\".", + "extension request title": "No extension found for {extension}", + "extension request message": "Ask for a plugin so Acode can highlight this file type.", + "search plugins": "Search plugins", + "request plugin": "Request plugin" } diff --git a/src/lang/pu-in.json b/src/lang/pu-in.json index f8ee0c857..cef15df34 100644 --- a/src/lang/pu-in.json +++ b/src/lang/pu-in.json @@ -766,5 +766,13 @@ "off": "ਬੰਦ", "quick tools height": "ਤੇਜ਼ ਟੂਲ ਦੀ ਉਚਾਈ", "quick tools toggler": "ਤੇਜ਼ ਟੂਲ ਟੌਗਲਰ", - "running processes": "Running processes" + "running processes": "Running processes", + "recommend extensions": "Recommend extensions", + "settings-info-editor-recommend-extensions": "Suggest plugins when a file opens as plain text because no language mode is available.", + "extension recommendation title": "Extensions available for {extension}", + "extension recommendation message": "No syntax mode is installed for {extension}. Search plugins for \"{keyword}\".", + "extension request title": "No extension found for {extension}", + "extension request message": "Ask for a plugin so Acode can highlight this file type.", + "search plugins": "Search plugins", + "request plugin": "Request plugin" } diff --git a/src/lang/ru-ru.json b/src/lang/ru-ru.json index 696b1d35d..5edbb1ab5 100644 --- a/src/lang/ru-ru.json +++ b/src/lang/ru-ru.json @@ -766,5 +766,13 @@ "off": "Выкл", "quick tools height": "Высота быстрых инструментов", "quick tools toggler": "Переключатель быстрых инструментов", - "running processes": "Running processes" + "running processes": "Running processes", + "recommend extensions": "Recommend extensions", + "settings-info-editor-recommend-extensions": "Suggest plugins when a file opens as plain text because no language mode is available.", + "extension recommendation title": "Extensions available for {extension}", + "extension recommendation message": "No syntax mode is installed for {extension}. Search plugins for \"{keyword}\".", + "extension request title": "No extension found for {extension}", + "extension request message": "Ask for a plugin so Acode can highlight this file type.", + "search plugins": "Search plugins", + "request plugin": "Request plugin" } diff --git a/src/lang/tl-ph.json b/src/lang/tl-ph.json index 2e2ffe982..79f775866 100644 --- a/src/lang/tl-ph.json +++ b/src/lang/tl-ph.json @@ -766,5 +766,13 @@ "off": "Off", "quick tools height": "Quick tools height", "quick tools toggler": "Quick tools toggler", - "running processes": "Running processes" + "running processes": "Running processes", + "recommend extensions": "Recommend extensions", + "settings-info-editor-recommend-extensions": "Suggest plugins when a file opens as plain text because no language mode is available.", + "extension recommendation title": "Extensions available for {extension}", + "extension recommendation message": "No syntax mode is installed for {extension}. Search plugins for \"{keyword}\".", + "extension request title": "No extension found for {extension}", + "extension request message": "Ask for a plugin so Acode can highlight this file type.", + "search plugins": "Search plugins", + "request plugin": "Request plugin" } diff --git a/src/lang/tr-tr.json b/src/lang/tr-tr.json index fd9434727..0323f2fbb 100644 --- a/src/lang/tr-tr.json +++ b/src/lang/tr-tr.json @@ -766,5 +766,13 @@ "off": "Kapalı", "quick tools height": "Hızlı araçlar yüksekliği", "quick tools toggler": "Hızlı araçlar değiştirici", - "running processes": "Running processes" + "running processes": "Running processes", + "recommend extensions": "Recommend extensions", + "settings-info-editor-recommend-extensions": "Suggest plugins when a file opens as plain text because no language mode is available.", + "extension recommendation title": "Extensions available for {extension}", + "extension recommendation message": "No syntax mode is installed for {extension}. Search plugins for \"{keyword}\".", + "extension request title": "No extension found for {extension}", + "extension request message": "Ask for a plugin so Acode can highlight this file type.", + "search plugins": "Search plugins", + "request plugin": "Request plugin" } diff --git a/src/lang/uk-ua.json b/src/lang/uk-ua.json index 0b35e291d..a7e0ca6c3 100644 --- a/src/lang/uk-ua.json +++ b/src/lang/uk-ua.json @@ -766,5 +766,13 @@ "off": "Вимк", "quick tools height": "Висота швидких інструментів", "quick tools toggler": "Перемикач швидких інструментів", - "running processes": "Running processes" + "running processes": "Running processes", + "recommend extensions": "Recommend extensions", + "settings-info-editor-recommend-extensions": "Suggest plugins when a file opens as plain text because no language mode is available.", + "extension recommendation title": "Extensions available for {extension}", + "extension recommendation message": "No syntax mode is installed for {extension}. Search plugins for \"{keyword}\".", + "extension request title": "No extension found for {extension}", + "extension request message": "Ask for a plugin so Acode can highlight this file type.", + "search plugins": "Search plugins", + "request plugin": "Request plugin" } diff --git a/src/lang/uz-uz.json b/src/lang/uz-uz.json index 1c4f0eef1..d348a92d6 100644 --- a/src/lang/uz-uz.json +++ b/src/lang/uz-uz.json @@ -766,5 +766,13 @@ "off": "Off", "quick tools height": "Quick tools height", "quick tools toggler": "Quick tools toggler", - "running processes": "Running processes" + "running processes": "Running processes", + "recommend extensions": "Recommend extensions", + "settings-info-editor-recommend-extensions": "Suggest plugins when a file opens as plain text because no language mode is available.", + "extension recommendation title": "Extensions available for {extension}", + "extension recommendation message": "No syntax mode is installed for {extension}. Search plugins for \"{keyword}\".", + "extension request title": "No extension found for {extension}", + "extension request message": "Ask for a plugin so Acode can highlight this file type.", + "search plugins": "Search plugins", + "request plugin": "Request plugin" } diff --git a/src/lang/vi-vn.json b/src/lang/vi-vn.json index eab04aeb2..5eca509e8 100644 --- a/src/lang/vi-vn.json +++ b/src/lang/vi-vn.json @@ -766,5 +766,13 @@ "off": "Tắt", "quick tools height": "Chiều cao công cụ nhanh", "quick tools toggler": "Bật/tắt công cụ nhanh", - "running processes": "Running processes" + "running processes": "Running processes", + "recommend extensions": "Recommend extensions", + "settings-info-editor-recommend-extensions": "Suggest plugins when a file opens as plain text because no language mode is available.", + "extension recommendation title": "Extensions available for {extension}", + "extension recommendation message": "No syntax mode is installed for {extension}. Search plugins for \"{keyword}\".", + "extension request title": "No extension found for {extension}", + "extension request message": "Ask for a plugin so Acode can highlight this file type.", + "search plugins": "Search plugins", + "request plugin": "Request plugin" } diff --git a/src/lang/zh-cn.json b/src/lang/zh-cn.json index e55b2ba76..8165c6da9 100644 --- a/src/lang/zh-cn.json +++ b/src/lang/zh-cn.json @@ -766,5 +766,13 @@ "off": "关闭", "quick tools height": "快捷工具栏高度", "quick tools toggler": "快捷工具切换按钮", - "running processes": "Running processes" + "running processes": "Running processes", + "recommend extensions": "Recommend extensions", + "settings-info-editor-recommend-extensions": "Suggest plugins when a file opens as plain text because no language mode is available.", + "extension recommendation title": "Extensions available for {extension}", + "extension recommendation message": "No syntax mode is installed for {extension}. Search plugins for \"{keyword}\".", + "extension request title": "No extension found for {extension}", + "extension request message": "Ask for a plugin so Acode can highlight this file type.", + "search plugins": "Search plugins", + "request plugin": "Request plugin" } diff --git a/src/lang/zh-hant.json b/src/lang/zh-hant.json index 075d8cb3d..6c8284c32 100644 --- a/src/lang/zh-hant.json +++ b/src/lang/zh-hant.json @@ -766,5 +766,13 @@ "off": "關閉", "quick tools height": "快捷工具欄高度", "quick tools toggler": "快捷工具切換按鈕", - "running processes": "Running processes" + "running processes": "Running processes", + "recommend extensions": "Recommend extensions", + "settings-info-editor-recommend-extensions": "Suggest plugins when a file opens as plain text because no language mode is available.", + "extension recommendation title": "Extensions available for {extension}", + "extension recommendation message": "No syntax mode is installed for {extension}. Search plugins for \"{keyword}\".", + "extension request title": "No extension found for {extension}", + "extension request message": "Ask for a plugin so Acode can highlight this file type.", + "search plugins": "Search plugins", + "request plugin": "Request plugin" } diff --git a/src/lang/zh-tw.json b/src/lang/zh-tw.json index 136a11553..8ea64caff 100644 --- a/src/lang/zh-tw.json +++ b/src/lang/zh-tw.json @@ -766,5 +766,13 @@ "off": "關閉", "quick tools height": "快捷工具列高度", "quick tools toggler": "快捷工具列切換按鈕", - "running processes": "Running processes" + "running processes": "Running processes", + "recommend extensions": "Recommend extensions", + "settings-info-editor-recommend-extensions": "Suggest plugins when a file opens as plain text because no language mode is available.", + "extension recommendation title": "Extensions available for {extension}", + "extension recommendation message": "No syntax mode is installed for {extension}. Search plugins for \"{keyword}\".", + "extension request title": "No extension found for {extension}", + "extension request message": "Ask for a plugin so Acode can highlight this file type.", + "search plugins": "Search plugins", + "request plugin": "Request plugin" } diff --git a/src/lib/languageModeRecommendations.js b/src/lib/languageModeRecommendations.js index 581413843..5f5d59156 100644 --- a/src/lib/languageModeRecommendations.js +++ b/src/lib/languageModeRecommendations.js @@ -101,22 +101,20 @@ class LanguageModeRecommendations { if (hasPlugins) { notificationManager.pushNotification({ - title: formatString( - strings["extension recommendation title"] || - "Extensions available for {extension}", - { extension: displayExt, keyword }, - ), - message: formatString( - strings["extension recommendation message"] || - 'No syntax mode is installed for {extension}. Search plugins for "{keyword}".', - { extension: displayExt, keyword }, - ), + title: formatString(strings["extension recommendation title"], { + extension: displayExt, + keyword, + }), + message: formatString(strings["extension recommendation message"], { + extension: displayExt, + keyword, + }), icon: "extension", type: "info", action: () => openExtensions(keyword), actions: [ { - text: strings["search plugins"] || "Search plugins", + text: strings["search plugins"], icon: "search", action: () => openExtensions(keyword), }, @@ -127,22 +125,20 @@ class LanguageModeRecommendations { const issueUrl = getIssueUrl(keyword); notificationManager.pushNotification({ - title: formatString( - strings["extension request title"] || - "No extension found for {extension}", - { extension: displayExt, keyword }, - ), - message: formatString( - strings["extension request message"] || - "Ask for a plugin so Acode can highlight this file type.", - { extension: displayExt, keyword }, - ), + title: formatString(strings["extension request title"], { + extension: displayExt, + keyword, + }), + message: formatString(strings["extension request message"], { + extension: displayExt, + keyword, + }), icon: "extension", type: "warning", action: () => openUrl(issueUrl), actions: [ { - text: strings["request plugin"] || "Request plugin", + text: strings["request plugin"], icon: "open_in_new", action: () => openUrl(issueUrl), }, diff --git a/src/settings/editorSettings.js b/src/settings/editorSettings.js index 5c8843930..572d29b8b 100644 --- a/src/settings/editorSettings.js +++ b/src/settings/editorSettings.js @@ -142,11 +142,9 @@ export default function editorSettings() { }, { key: "recommendExtensions", - text: strings["recommend extensions"] || "Recommend extensions", + text: strings["recommend extensions"], checkbox: values.recommendExtensions ?? true, - info: - strings["settings-info-editor-recommend-extensions"] || - "Suggest plugins when a file opens as plain text because no language mode is available.", + info: strings["settings-info-editor-recommend-extensions"], category: categories.assistance, }, { From 53e8cf2f61a86cef83f2467db0de14d2a7e5ea28 Mon Sep 17 00:00:00 2001 From: Raunak Raj <71929976+bajrangCoder@users.noreply.github.com> Date: Tue, 23 Jun 2026 16:49:02 +0530 Subject: [PATCH 3/5] fix --- src/lib/languageModeRecommendations.js | 27 ++++++++++++++++++------ src/sidebarApps/extensions/index.js | 29 ++++++++++++++++++++++---- 2 files changed, 46 insertions(+), 10 deletions(-) diff --git a/src/lib/languageModeRecommendations.js b/src/lib/languageModeRecommendations.js index 5f5d59156..2462ad7dd 100644 --- a/src/lib/languageModeRecommendations.js +++ b/src/lib/languageModeRecommendations.js @@ -58,6 +58,7 @@ function hasPlainTextFallback(modeInfo, filename) { class LanguageModeRecommendations { notifiedKeywords = new Set(); + pendingKeywords = new Set(); availabilityCache = new Map(); async getPluginAvailability(keyword) { @@ -73,9 +74,9 @@ class LanguageModeRecommendations { ), ), ) - .then((response) => response.json()) + .then((response) => (response.ok ? response.json() : [])) .then((plugins) => Array.isArray(plugins) && plugins.length > 0) - .catch(() => true); + .catch(() => false); this.availabilityCache.set(keyword, availability); return availability; @@ -88,11 +89,25 @@ class LanguageModeRecommendations { if (!hasPlainTextFallback(modeInfo, filename)) return; const keyword = getSearchKeyword(filename); - if (!keyword || this.notifiedKeywords.has(keyword)) return; - - this.notifiedKeywords.add(keyword); + if ( + !keyword || + this.notifiedKeywords.has(keyword) || + this.pendingKeywords.has(keyword) + ) { + return; + } - void this.showRecommendation(keyword); + this.pendingKeywords.add(keyword); + void this.showRecommendation(keyword) + .then(() => { + this.notifiedKeywords.add(keyword); + }) + .catch((error) => { + console.warn("Failed to show extension recommendation.", error); + }) + .finally(() => { + this.pendingKeywords.delete(keyword); + }); } async showRecommendation(keyword) { diff --git a/src/sidebarApps/extensions/index.js b/src/sidebarApps/extensions/index.js index 7d7d7d756..bc55678e9 100644 --- a/src/sidebarApps/extensions/index.js +++ b/src/sidebarApps/extensions/index.js @@ -27,6 +27,7 @@ let container = null; let $searchResult = null; const LIMIT = 50; +const SEARCH_INPUT_WAIT_TIMEOUT = 1000; let currentPage = 1; let hasMore = true; let isLoading = false; @@ -260,15 +261,35 @@ async function runSearch(query) { } } -export function openWithSearch(query) { +function getSearchInput() { + return container?.querySelector('input[name="search-ext"]'); +} + +function waitForSearchInput() { + const startTime = Date.now(); + + return new Promise((resolve) => { + const check = () => { + const searchInput = getSearchInput(); + if (searchInput || Date.now() - startTime >= SEARCH_INPUT_WAIT_TIMEOUT) { + resolve(searchInput); + return; + } + + requestAnimationFrame(check); + }; + + check(); + }); +} + +export async function openWithSearch(query) { Sidebar.show(); document .querySelector('[data-action="sidebar-app"][data-id="extensions"]') ?.click(); - if (!container) return; - - const searchInput = container.querySelector('input[name="search-ext"]'); + const searchInput = await waitForSearchInput(); if (!searchInput) return; searchInput.value = query; From 94118ab8971bf75158bf7aec365cb27ab6364f38 Mon Sep 17 00:00:00 2001 From: Raunak Raj <71929976+bajrangCoder@users.noreply.github.com> Date: Tue, 23 Jun 2026 17:21:00 +0530 Subject: [PATCH 4/5] fixed switch state issue on settings global search --- src/components/searchbar/index.js | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/components/searchbar/index.js b/src/components/searchbar/index.js index bd2b032c0..058980fba 100644 --- a/src/components/searchbar/index.js +++ b/src/components/searchbar/index.js @@ -190,6 +190,7 @@ function searchBar( */ function cloneSearchItem($item) { const $clone = $item.cloneNode(true); + syncCheckboxState($clone, $item); $clone.addEventListener("click", () => { $item.addEventListener( "settings-item-interaction-end", @@ -213,6 +214,26 @@ function searchBar( function syncSearchClone($clone, $item) { $clone.className = $item.className; $clone.innerHTML = $item.innerHTML; + syncCheckboxState($clone, $item); + } + + /** + * Sync the checked property of checkbox and radio elements, since cloneNode and innerHTML do not copy/preserve dynamic checked state. + * @param {HTMLElement} $clone + * @param {HTMLElement} $item + */ + function syncCheckboxState($clone, $item) { + const $itemCheckbox = $item.querySelector( + 'input[type="checkbox"], input[type="radio"]', + ); + if ($itemCheckbox) { + const $cloneCheckbox = $clone.querySelector( + 'input[type="checkbox"], input[type="radio"]', + ); + if ($cloneCheckbox) { + $cloneCheckbox.checked = $itemCheckbox.checked; + } + } } } From 370c77bfa9b6a46692b0c4e41a563b8138382ba5 Mon Sep 17 00:00:00 2001 From: Raunak Raj <71929976+bajrangCoder@users.noreply.github.com> Date: Tue, 23 Jun 2026 18:44:30 +0530 Subject: [PATCH 5/5] user server mode filter for search --- src/lib/languageModeRecommendations.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/lib/languageModeRecommendations.js b/src/lib/languageModeRecommendations.js index 2462ad7dd..68cdd9e18 100644 --- a/src/lib/languageModeRecommendations.js +++ b/src/lib/languageModeRecommendations.js @@ -70,7 +70,7 @@ class LanguageModeRecommendations { withSupportedEditor( Url.join( config.API_BASE, - `plugins?name=${encodeURIComponent(keyword)}`, + `plugins?name=${encodeURIComponent(`mode:${keyword}`)}`, ), ), ) @@ -118,20 +118,20 @@ class LanguageModeRecommendations { notificationManager.pushNotification({ title: formatString(strings["extension recommendation title"], { extension: displayExt, - keyword, + keyword: `mode:${keyword}`, }), message: formatString(strings["extension recommendation message"], { extension: displayExt, - keyword, + keyword: `mode:${keyword}`, }), icon: "extension", type: "info", - action: () => openExtensions(keyword), + action: () => openExtensions(`mode:${keyword}`), actions: [ { text: strings["search plugins"], icon: "search", - action: () => openExtensions(keyword), + action: () => openExtensions(`mode:${keyword}`), }, ], });