mirror of
https://github.com/discourse/discourse.git
synced 2024-12-01 12:35:12 +08:00
c58cd697d2
Followup e37fb3042d
* Automatically remove the prefix `Discourse ` from all the plugin titles to avoid repetition
* Remove the :discourse_dev: icon from the author. Consider a "By Discourse" with no labels as official
* We add a `label` metadata to plugin.rb
* Only plugins made by us in `discourse` and `discourse-org` GitHub organizations will show these in the list
* Make the plugin author font size a little smaller
* Make the commit sha look like a link so it's more obvious it goes to the code
Also I added some validation and truncation for plugin metadata
parsing since currently you can put absolutely anything in there
and it will show on the plugin list.
93 lines
2.6 KiB
JavaScript
93 lines
2.6 KiB
JavaScript
import { tracked } from "@glimmer/tracking";
|
|
import { capitalize } from "@ember/string";
|
|
import I18n from "discourse-i18n";
|
|
|
|
export default class AdminPlugin {
|
|
static create(args = {}) {
|
|
return new AdminPlugin(args);
|
|
}
|
|
|
|
@tracked enabled;
|
|
|
|
constructor(args = {}) {
|
|
this.about = args.about;
|
|
this.adminRoute = args.admin_route;
|
|
this.commitHash = args.commit_hash;
|
|
this.commitUrl = args.commit_url;
|
|
this.enabled = args.enabled;
|
|
this.enabledSetting = args.enabled_setting;
|
|
this.hasSettings = args.has_settings;
|
|
this.id = args.id;
|
|
this.isOfficial = args.is_official;
|
|
this.isDiscourseOwned = args.is_discourse_owned;
|
|
this.label = args.label;
|
|
this.name = args.name;
|
|
this.url = args.url;
|
|
this.version = args.version;
|
|
this.metaUrl = args.meta_url;
|
|
this.authors = args.authors;
|
|
}
|
|
|
|
get snakeCaseName() {
|
|
return this.name.replaceAll("-", "_");
|
|
}
|
|
|
|
get translatedCategoryName() {
|
|
// We do this because the site setting list is grouped by category,
|
|
// with plugins that have their root site setting key defined as `plugins:`
|
|
// being grouped under the generic "plugins" category.
|
|
//
|
|
// If a site setting has defined a proper root key and translated category name,
|
|
// we can use that instead to go directly to the setting category.
|
|
//
|
|
// Over time, no plugins should be missing this data.
|
|
return I18n.lookup(`admin.site_settings.categories.${this.snakeCaseName}`);
|
|
}
|
|
|
|
get settingCategoryName() {
|
|
if (this.translatedCategoryName) {
|
|
return this.snakeCaseName;
|
|
}
|
|
|
|
return "plugins";
|
|
}
|
|
|
|
get nameTitleized() {
|
|
// The category name is better in a lot of cases, as it's a human-inputted
|
|
// translation, and we can handle things like SAML instead of showing them
|
|
// as Saml from discourse-saml. We can fall back to the programattic version
|
|
// though if needed.
|
|
let name;
|
|
if (this.translatedCategoryName) {
|
|
name = this.translatedCategoryName;
|
|
} else {
|
|
name = this.name
|
|
.split("-")
|
|
.map((word) => {
|
|
return capitalize(word);
|
|
})
|
|
.join(" ");
|
|
}
|
|
|
|
// Cuts down on repetition.
|
|
const discoursePrefix = "Discourse ";
|
|
if (name.startsWith(discoursePrefix)) {
|
|
name = name.slice(discoursePrefix.length);
|
|
}
|
|
|
|
return name;
|
|
}
|
|
|
|
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;
|
|
}
|
|
}
|