mirror of
https://github.com/discourse/discourse.git
synced 2025-02-25 18:55:32 -06:00
DEV: Add experimental registerCustomCategorySectionLinkPrefix api (#21656)
This commit adds the experimental `registerCustomCategorySectionLinkPrefix` client side plugin API that allows themes or plugins to override the prefix of a category section link. This is marked experimental because we might be introducing a core feature where category icons are supported. This is currently use as a bridge for the https://github.com/discourse/discourse-category-icons theme component.
This commit is contained in:
parent
27e065fc1f
commit
33864ab18f
@ -106,6 +106,7 @@ import { addSectionLink as addCustomCommunitySectionLink } from "discourse/lib/s
|
|||||||
import { addSidebarSection } from "discourse/lib/sidebar/custom-sections";
|
import { addSidebarSection } from "discourse/lib/sidebar/custom-sections";
|
||||||
import {
|
import {
|
||||||
registerCustomCategoryLockIcon,
|
registerCustomCategoryLockIcon,
|
||||||
|
registerCustomCategorySectionLinkPrefix,
|
||||||
registerCustomCountable as registerUserCategorySectionLinkCountable,
|
registerCustomCountable as registerUserCategorySectionLinkCountable,
|
||||||
} from "discourse/lib/sidebar/user/categories-section/category-section-link";
|
} from "discourse/lib/sidebar/user/categories-section/category-section-link";
|
||||||
import { REFRESH_COUNTS_APP_EVENT_NAME as REFRESH_USER_SIDEBAR_CATEGORIES_SECTION_COUNTS_APP_EVENT_NAME } from "discourse/components/sidebar/user/categories-section";
|
import { REFRESH_COUNTS_APP_EVENT_NAME as REFRESH_USER_SIDEBAR_CATEGORIES_SECTION_COUNTS_APP_EVENT_NAME } from "discourse/components/sidebar/user/categories-section";
|
||||||
@ -1924,6 +1925,45 @@ class PluginApi {
|
|||||||
return registerCustomCategoryLockIcon(icon);
|
return registerCustomCategoryLockIcon(icon);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* EXPERIMENTAL. Do not use.
|
||||||
|
* Register a custom prefix for a sidebar category section link.
|
||||||
|
*
|
||||||
|
* Example:
|
||||||
|
*
|
||||||
|
* ```
|
||||||
|
* api.registerCustomCategorySectionLinkPrefix({
|
||||||
|
* categoryId: category.id,
|
||||||
|
* prefixType: "icon",
|
||||||
|
* prefixValue: "wrench",
|
||||||
|
* prefixColor: "FF0000"
|
||||||
|
* })
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* @params {Object} arg - An object
|
||||||
|
* @params {string} arg.categoryId - The id of the category
|
||||||
|
* @params {string} arg.prefixType - The type of prefix to use. Can be "icon", "image", "text" or "span".
|
||||||
|
* @params {string} arg.prefixValue - The value of the prefix to use.
|
||||||
|
* For "icon", pass in the name of a FontAwesome 5 icon.
|
||||||
|
* For "image", pass in the src of the image.
|
||||||
|
* For "text", pass in the text to display.
|
||||||
|
* For "span", pass in an array containing two hex color values. Example: `[FF0000, 000000]`.
|
||||||
|
* @params {string} arg.prefixColor - The color of the prefix to use. Example: "FF0000".
|
||||||
|
*/
|
||||||
|
registerCustomCategorySectionLinkPrefix({
|
||||||
|
categoryId,
|
||||||
|
prefixType,
|
||||||
|
prefixValue,
|
||||||
|
prefixColor,
|
||||||
|
}) {
|
||||||
|
registerCustomCategorySectionLinkPrefix({
|
||||||
|
categoryId,
|
||||||
|
prefixType,
|
||||||
|
prefixValue,
|
||||||
|
prefixColor,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* EXPERIMENTAL. Do not use.
|
* EXPERIMENTAL. Do not use.
|
||||||
* Triggers a refresh of the counts for all category section links under the categories section for a logged in user.
|
* Triggers a refresh of the counts for all category section links under the categories section for a logged in user.
|
||||||
|
@ -82,6 +82,29 @@ export function resetCustomCategoryLockIcon() {
|
|||||||
customCategoryLockIcon = null;
|
customCategoryLockIcon = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let customCategoryPrefixes = {};
|
||||||
|
|
||||||
|
export function registerCustomCategorySectionLinkPrefix({
|
||||||
|
categoryId,
|
||||||
|
prefixValue,
|
||||||
|
prefixType,
|
||||||
|
prefixColor,
|
||||||
|
}) {
|
||||||
|
customCategoryPrefixes[categoryId] = {
|
||||||
|
prefixValue,
|
||||||
|
prefixType,
|
||||||
|
prefixColor,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export function resetCustomCategorySectionLinkPrefix() {
|
||||||
|
for (let key in customCategoryPrefixes) {
|
||||||
|
if (customCategoryPrefixes.hasOwnProperty(key)) {
|
||||||
|
delete customCategoryPrefixes[key];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export default class CategorySectionLink {
|
export default class CategorySectionLink {
|
||||||
@tracked activeCountable;
|
@tracked activeCountable;
|
||||||
|
|
||||||
@ -166,10 +189,17 @@ export default class CategorySectionLink {
|
|||||||
}
|
}
|
||||||
|
|
||||||
get prefixType() {
|
get prefixType() {
|
||||||
return "span";
|
return customCategoryPrefixes[this.category.id]?.prefixType || "span";
|
||||||
}
|
}
|
||||||
|
|
||||||
get prefixValue() {
|
get prefixValue() {
|
||||||
|
const customPrefixValue =
|
||||||
|
customCategoryPrefixes[this.category.id]?.prefixValue;
|
||||||
|
|
||||||
|
if (customPrefixValue) {
|
||||||
|
return customPrefixValue;
|
||||||
|
}
|
||||||
|
|
||||||
if (this.category.parentCategory?.color) {
|
if (this.category.parentCategory?.color) {
|
||||||
return [this.category.parentCategory?.color, this.category.color];
|
return [this.category.parentCategory?.color, this.category.color];
|
||||||
} else {
|
} else {
|
||||||
@ -178,7 +208,10 @@ export default class CategorySectionLink {
|
|||||||
}
|
}
|
||||||
|
|
||||||
get prefixColor() {
|
get prefixColor() {
|
||||||
return this.category.color;
|
return (
|
||||||
|
customCategoryPrefixes[this.category.id]?.prefixColor ||
|
||||||
|
this.category.color
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
get prefixBadge() {
|
get prefixBadge() {
|
||||||
|
@ -12,6 +12,7 @@ import { PLUGIN_API_VERSION, withPluginApi } from "discourse/lib/plugin-api";
|
|||||||
import Site from "discourse/models/site";
|
import Site from "discourse/models/site";
|
||||||
import {
|
import {
|
||||||
resetCustomCategoryLockIcon,
|
resetCustomCategoryLockIcon,
|
||||||
|
resetCustomCategorySectionLinkPrefix,
|
||||||
resetCustomCountables,
|
resetCustomCountables,
|
||||||
} from "discourse/lib/sidebar/user/categories-section/category-section-link";
|
} from "discourse/lib/sidebar/user/categories-section/category-section-link";
|
||||||
import { UNREAD_LIST_DESTINATION } from "discourse/controllers/preferences/sidebar";
|
import { UNREAD_LIST_DESTINATION } from "discourse/controllers/preferences/sidebar";
|
||||||
@ -779,4 +780,44 @@ acceptance("Sidebar - Plugin API", function (needs) {
|
|||||||
resetCustomCategoryLockIcon();
|
resetCustomCategoryLockIcon();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test("Customizing the prefix used in a category section link for a particular category", async function (assert) {
|
||||||
|
try {
|
||||||
|
return await withPluginApi(PLUGIN_API_VERSION, async (api) => {
|
||||||
|
const categories = Site.current().categories;
|
||||||
|
const category1 = categories[0];
|
||||||
|
category1.read_restricted = true;
|
||||||
|
|
||||||
|
updateCurrentUser({
|
||||||
|
sidebar_category_ids: [category1.id],
|
||||||
|
});
|
||||||
|
|
||||||
|
api.registerCustomCategorySectionLinkPrefix({
|
||||||
|
categoryId: category1.id,
|
||||||
|
prefixType: "icon",
|
||||||
|
prefixValue: "wrench",
|
||||||
|
prefixColor: "FF0000", // rgb(255, 0, 0)
|
||||||
|
});
|
||||||
|
|
||||||
|
await visit("/");
|
||||||
|
|
||||||
|
assert.ok(
|
||||||
|
exists(
|
||||||
|
`.sidebar-section-link[data-category-id="${category1.id}"] .prefix-icon.d-icon-wrench`
|
||||||
|
),
|
||||||
|
"wrench icon is displayed for the section link's prefix icon"
|
||||||
|
);
|
||||||
|
|
||||||
|
assert.strictEqual(
|
||||||
|
query(
|
||||||
|
`.sidebar-section-link[data-category-id="${category1.id}"] .sidebar-section-link-prefix`
|
||||||
|
).style.color,
|
||||||
|
"rgb(255, 0, 0)",
|
||||||
|
"section link's prefix icon has the right color"
|
||||||
|
);
|
||||||
|
});
|
||||||
|
} finally {
|
||||||
|
resetCustomCategorySectionLinkPrefix();
|
||||||
|
}
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
Loading…
Reference in New Issue
Block a user