From 28fe98e787a3318c54c2f820a76cb1b8780f4d4a Mon Sep 17 00:00:00 2001 From: LukeGus Date: Fri, 9 Oct 2026 14:16:29 -0500 Subject: [PATCH] feat: note in the plugins tab that community plugins are coming --- CHANGELOG.md | 1 + README.md | 2 +- src/ui/lib/docs-pages.json | 3 +- src/ui/locales/en.json | 2 + src/ui/plugins/PluginsTab.tsx | 7 ++++ src/ui/tests/plugins/PluginsTab.test.tsx | 49 ++++++++++++++++++++++++ 6 files changed, 62 insertions(+), 2 deletions(-) create mode 100644 src/ui/tests/plugins/PluginsTab.test.tsx diff --git a/CHANGELOG.md b/CHANGELOG.md index 5e877b226..ec8a614dc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ - Plugins. Every feature beyond hosts, credentials and sharing is now its own plugin with its own repo, and you pick which ones you want - A Plugins tab to install, update, pin, turn off and remove plugins from the official registry, with release notes and a beta channel per plugin - Developer mode to install a plugin from a file, and a plugin SDK on npm to build your own +- The community plugin registry is open for submissions. Termix can install community plugins in a later update - Redesigned UI with a Manage tab for hosts and credentials and a Settings tab with search - New full screen onboarding where you choose which plugins to start with - Beta channel for Termix itself in Settings > Updates diff --git a/README.md b/README.md index 4fcb7af5b..43975fd02 100644 --- a/README.md +++ b/README.md @@ -92,7 +92,7 @@ Plugins add everything else. The official ones ship with Termix, and admins can | [Web Endpoint](https://github.com/Termix-SSH/Plugin-Web-Endpoint) | Open a host's web UI inside Termix, directly or over an SSH tunnel. | | [Workspaces](https://github.com/Termix-SSH/Plugin-Workspaces) | Save your open tabs and split layouts and reopen them in one click. | -Want to build your own? Start from the [plugin template](https://github.com/Termix-SSH/Termix-Plugin-Template). Plugins you can install are listed in the [registry](https://github.com/Termix-SSH/Termix-Registry). +Want to build your own? Start from the [plugin template](https://github.com/Termix-SSH/Termix-Plugin-Template). Plugins you can install are listed in the [registry](https://github.com/Termix-SSH/Termix-Registry). Its community registry is open for submissions now, and Termix will be able to install community plugins in a later update. See [submitting a plugin](https://docs.termix.site/develop/community-registry).
diff --git a/src/ui/lib/docs-pages.json b/src/ui/lib/docs-pages.json index b946042ec..ecfc2a689 100644 --- a/src/ui/lib/docs-pages.json +++ b/src/ui/lib/docs-pages.json @@ -37,5 +37,6 @@ "plugins": "guide/plugins", "pluginCatalog": "plugins", "cli": "cli", - "develop": "develop" + "develop": "develop", + "communityRegistry": "develop/community-registry" } diff --git a/src/ui/locales/en.json b/src/ui/locales/en.json index 897aff74e..a54bc4f53 100644 --- a/src/ui/locales/en.json +++ b/src/ui/locales/en.json @@ -2017,6 +2017,8 @@ "noneInstalled": "No plugins installed yet. Browse to add some.", "nothingHere": "Nothing here.", "nothingHereHint": "Try another category or search.", + "communitySoon": "Community plugins are coming in a later update. Plugin authors can already submit theirs to the community registry.", + "communitySubmit": "How to submit", "upToDate": "Everything is up to date.", "lastChecked": "Last checked {{time}}", "updatesReady_one": "{{count}} update ready.", diff --git a/src/ui/plugins/PluginsTab.tsx b/src/ui/plugins/PluginsTab.tsx index 5bf147f3e..5e06bb95f 100644 --- a/src/ui/plugins/PluginsTab.tsx +++ b/src/ui/plugins/PluginsTab.tsx @@ -658,6 +658,13 @@ function BrowseSection({ ))} )} + +

+ {t("plugins.manager.communitySoon")}{" "} + + {t("plugins.manager.communitySubmit")} + +

); } diff --git a/src/ui/tests/plugins/PluginsTab.test.tsx b/src/ui/tests/plugins/PluginsTab.test.tsx new file mode 100644 index 000000000..4e5cec2de --- /dev/null +++ b/src/ui/tests/plugins/PluginsTab.test.tsx @@ -0,0 +1,49 @@ +import { afterEach, describe, expect, it, vi } from "vitest"; +import { cleanup, fireEvent, render, screen } from "@testing-library/react"; +import i18next from "i18next"; +import { I18nextProvider, initReactI18next } from "react-i18next"; +import en from "@/locales/en.json"; +import { PluginsTab } from "@/plugins/PluginsTab"; +import { docsUrl } from "@/lib/docs"; + +vi.mock("@/plugins/use-plugins-manager", () => ({ + usePluginsManager: () => ({ + plugins: [], + loading: false, + refreshing: false, + refresh: vi.fn(), + registryError: null, + managedByServer: false, + busy: new Set(), + consent: null, + setConsent: vi.fn(), + confirmConsent: vi.fn(), + developerMode: false, + signedOnly: false, + }), +})); + +afterEach(cleanup); + +describe("PluginsTab", () => { + it("tells people community plugins are coming and links the guide", async () => { + const i18n = i18next.createInstance(); + await i18n.use(initReactI18next).init({ + lng: "en", + resources: { en: { translation: en } }, + }); + + render( + + + , + ); + fireEvent.click(screen.getByText(en.plugins.manager.tabs.browse)); + + expect( + screen.getByText(en.plugins.manager.communitySoon, { exact: false }), + ).toBeTruthy(); + const link = screen.getByText(en.plugins.manager.communitySubmit); + expect(link.getAttribute("href")).toBe(docsUrl("communityRegistry")); + }); +});