From e37fb3042d6f56a27a01614e57bc7029f472b0c9 Mon Sep 17 00:00:00 2001 From: Martin Brennan Date: Tue, 21 Nov 2023 09:37:11 +1000 Subject: [PATCH] FEATURE: Admin plugin list redesign (#24363) * Remove checkmark for official plugins * Add author for plugin, which is By Discourse for all discourse and discourse-org github plugins * Link to meta topic instead of github repo * Add experimental flag for plugin metadata and show this as a badge on the plugin list if present --------- Co-authored-by: chapoi <101828855+chapoi@users.noreply.github.com> --- .../components/admin-plugins-list-item.gjs | 115 ++++++++++++++++++ .../addon/components/admin-plugins-list.gjs | 23 ++++ .../admin/addon/models/admin-plugin.js | 25 ++++ .../admin/addon/templates/plugins-index.hbs | 85 +------------ .../tests/acceptance/admin-plugins-test.js | 13 +- .../stylesheets/common/admin/plugins.scss | 89 +++++++++----- app/serializers/admin_plugin_serializer.rb | 17 ++- config/locales/client.en.yml | 7 +- lib/plugin/instance.rb | 8 ++ lib/plugin/metadata.rb | 1 + plugins/checklist/plugin.rb | 1 + plugins/footnote/plugin.rb | 1 + plugins/spoiler-alert/plugin.rb | 1 + plugins/styleguide/plugin.rb | 1 + spec/lib/plugin/instance_spec.rb | 19 ++- spec/system/admin_plugins_list_spec.rb | 33 +++++ 16 files changed, 320 insertions(+), 119 deletions(-) create mode 100644 app/assets/javascripts/admin/addon/components/admin-plugins-list-item.gjs create mode 100644 app/assets/javascripts/admin/addon/components/admin-plugins-list.gjs create mode 100644 spec/system/admin_plugins_list_spec.rb diff --git a/app/assets/javascripts/admin/addon/components/admin-plugins-list-item.gjs b/app/assets/javascripts/admin/addon/components/admin-plugins-list-item.gjs new file mode 100644 index 00000000000..cd69009998a --- /dev/null +++ b/app/assets/javascripts/admin/addon/components/admin-plugins-list-item.gjs @@ -0,0 +1,115 @@ +import Component from "@glimmer/component"; +import { concat, fn, hash } from "@ember/helper"; +import { on } from "@ember/modifier"; +import { action } from "@ember/object"; +import { LinkTo } from "@ember/routing"; +import { inject as service } from "@ember/service"; +import DToggleSwitch from "discourse/components/d-toggle-switch"; +import { popupAjaxError } from "discourse/lib/ajax-error"; +import icon from "discourse-common/helpers/d-icon"; +import i18n from "discourse-common/helpers/i18n"; +import SiteSetting from "admin/models/site-setting"; +import PluginCommitHash from "./plugin-commit-hash"; + +export default class AdminPluginsListItem extends Component { + @service session; + @service currentUser; + + @action + async togglePluginEnabled(plugin) { + const oldValue = plugin.enabled; + const newValue = !oldValue; + + try { + plugin.enabled = newValue; + await SiteSetting.update(plugin.enabledSetting, newValue); + this.session.requiresRefresh = true; + } catch (err) { + plugin.enabled = oldValue; + popupAjaxError(err); + } + } + + +} diff --git a/app/assets/javascripts/admin/addon/components/admin-plugins-list.gjs b/app/assets/javascripts/admin/addon/components/admin-plugins-list.gjs new file mode 100644 index 00000000000..a2477fe9770 --- /dev/null +++ b/app/assets/javascripts/admin/addon/components/admin-plugins-list.gjs @@ -0,0 +1,23 @@ +import Component from "@glimmer/component"; +import i18n from "discourse-common/helpers/i18n"; +import AdminPluginsListItem from "./admin-plugins-list-item"; + +export default class AdminPluginsList extends Component { + +} diff --git a/app/assets/javascripts/admin/addon/models/admin-plugin.js b/app/assets/javascripts/admin/addon/models/admin-plugin.js index 4dea352f6ff..3cf10b688c7 100644 --- a/app/assets/javascripts/admin/addon/models/admin-plugin.js +++ b/app/assets/javascripts/admin/addon/models/admin-plugin.js @@ -1,4 +1,5 @@ import { tracked } from "@glimmer/tracking"; +import { capitalize } from "@ember/string"; import I18n from "discourse-i18n"; export default class AdminPlugin { @@ -18,10 +19,13 @@ export default class AdminPlugin { this.hasSettings = args.has_settings; this.id = args.id; this.isOfficial = args.is_official; + this.isDiscourseOwned = args.is_discourse_owned; + this.isExperimental = args.is_experimental; this.name = args.name; this.url = args.url; this.version = args.version; this.metaUrl = args.meta_url; + this.authors = args.authors; } get settingCategoryName() { @@ -44,4 +48,25 @@ export default class AdminPlugin { return "plugins"; } + + get nameTitleized() { + return this.name + .split("-") + .map((word) => { + return capitalize(word); + }) + .join(" "); + } + + get author() { + if (this.isOfficial || this.isDiscourseOwned) { + return I18n.t("admin.plugins.author", { author: "Discourse" }); + } + + return I18n.t("admin.plugins.author", { author: this.authors }); + } + + get linkUrl() { + return this.metaUrl || this.url; + } } diff --git a/app/assets/javascripts/admin/addon/templates/plugins-index.hbs b/app/assets/javascripts/admin/addon/templates/plugins-index.hbs index 30bcea8a171..d6d4e3abd54 100644 --- a/app/assets/javascripts/admin/addon/templates/plugins-index.hbs +++ b/app/assets/javascripts/admin/addon/templates/plugins-index.hbs @@ -1,88 +1,15 @@ {{#if this.model.length}}

{{i18n "admin.plugins.installed"}}

- - - - - - - - - - - - - {{#each this.model as |plugin|}} - - - - - - - - - {{/each}} - -
{{i18n "admin.plugins.name"}}{{i18n "admin.plugins.version"}}{{i18n "admin.plugins.enabled"}}
- {{#if plugin.isOfficial}} - {{d-icon - "check-circle" - title="admin.plugins.official" - class="admin-plugins-official-badge" - }} - {{/if}} - -
- {{#if plugin.url}} - {{plugin.name}} {{d-icon "external-link-alt"}} - {{else}} - {{plugin.name}} - {{/if}} -
-
- {{plugin.about}} -
-
-
{{i18n "admin.plugins.version"}}
- {{plugin.version}}
- -
-
{{i18n "admin.plugins.enabled"}}
- {{#if plugin.enabledSetting}} - - {{else}} - - {{/if}} -
- {{#if this.currentUser.admin}} - {{#if plugin.hasSettings}} - - {{d-icon "cog"}} - {{i18n "admin.plugins.change_settings_short"}} - - {{/if}} - {{/if}} -
+ {{else}}

{{i18n "admin.plugins.none_installed"}}

{{/if}} -

{{i18n "admin.plugins.howto"}}

+

+ + {{i18n "admin.plugins.howto"}} + +