mirror of
https://github.com/discourse/discourse.git
synced 2025-02-16 19:22:46 +08:00
DEV: allow positioning of nav items and allow selection
Previously we could not place extra nav items in a particular order. This change introduces a new `before` attribute to addNavigationBarItem with this attribute we can place a nav item before "top" or any other place. Additionally this allows navigation items to force active state. In some cases we may want an items that is simply a "filter" on latest using `?query_params` when we do that we can "force" the filter active. A concrete example is the assign plugin that adds a nav item for Unassigned => `/c/cat-slug/l/latest?assigned=nobody&status=open` If we did not force then latest would be selected even though the filter is clicked.
This commit is contained in:
parent
70c6831125
commit
9fb09d147d
|
@ -15,8 +15,11 @@ export default Component.extend(
|
||||||
hidden: false,
|
hidden: false,
|
||||||
rerenderTriggers: ["content.count"],
|
rerenderTriggers: ["content.count"],
|
||||||
|
|
||||||
@computed("content.filterMode", "filterMode")
|
@computed("content.filterMode", "filterMode", "content.active")
|
||||||
active(contentFilterMode, filterMode) {
|
active(contentFilterMode, filterMode, active) {
|
||||||
|
if (active !== undefined) {
|
||||||
|
return active;
|
||||||
|
}
|
||||||
return (
|
return (
|
||||||
contentFilterMode === filterMode ||
|
contentFilterMode === filterMode ||
|
||||||
filterMode.indexOf(contentFilterMode) === 0
|
filterMode.indexOf(contentFilterMode) === 0
|
||||||
|
|
|
@ -46,7 +46,7 @@ import { queryRegistry } from "discourse/widgets/widget";
|
||||||
import Composer from "discourse/models/composer";
|
import Composer from "discourse/models/composer";
|
||||||
|
|
||||||
// If you add any methods to the API ensure you bump up this number
|
// If you add any methods to the API ensure you bump up this number
|
||||||
const PLUGIN_API_VERSION = "0.8.34";
|
const PLUGIN_API_VERSION = "0.8.35";
|
||||||
|
|
||||||
class PluginApi {
|
class PluginApi {
|
||||||
constructor(version, container) {
|
constructor(version, container) {
|
||||||
|
@ -736,7 +736,9 @@ class PluginApi {
|
||||||
* displayName: "bugs"
|
* displayName: "bugs"
|
||||||
* href: "/c/bugs",
|
* href: "/c/bugs",
|
||||||
* customFilter: (category, args, router) => { category && category.name !== 'bug' }
|
* customFilter: (category, args, router) => { category && category.name !== 'bug' }
|
||||||
* customHref: (category, args, router) => { if (category && category.name) === 'not-a-bug') "/a-feature"; }
|
* customHref: (category, args, router) => { if (category && category.name) === 'not-a-bug') "/a-feature"; },
|
||||||
|
* before: "top",
|
||||||
|
* forceActive(category, args, router) => router.currentURL === "/a/b/c/d";
|
||||||
* })
|
* })
|
||||||
*/
|
*/
|
||||||
addNavigationBarItem(item) {
|
addNavigationBarItem(item) {
|
||||||
|
@ -763,6 +765,14 @@ class PluginApi {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const forceActive = item.forceActive;
|
||||||
|
if (forceActive) {
|
||||||
|
const router = this.container.lookup("service:router");
|
||||||
|
item.forceActive = function(category, args) {
|
||||||
|
return forceActive(category, args, router);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
addNavItem(item);
|
addNavItem(item);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -193,12 +193,42 @@ NavItem.reopenClass({
|
||||||
return item.customFilter.call(this, category, args);
|
return item.customFilter.call(this, category, args);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
let forceActive = false;
|
||||||
|
|
||||||
extraItems.forEach(item => {
|
extraItems.forEach(item => {
|
||||||
|
const before = item.before;
|
||||||
|
if (before) {
|
||||||
|
let i = 0;
|
||||||
|
for (i = 0; i < items.length; i++) {
|
||||||
|
if (items[i].name === before) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
items.splice(i, 0, item);
|
||||||
|
} else {
|
||||||
|
items.push(item);
|
||||||
|
}
|
||||||
|
|
||||||
if (!item.customHref) return;
|
if (!item.customHref) return;
|
||||||
|
|
||||||
item.set("href", item.customHref.call(this, category, args));
|
item.set("href", item.customHref.call(this, category, args));
|
||||||
|
|
||||||
|
if (item.forceActive && item.forceActive.call(this, category, args)) {
|
||||||
|
item.active = true;
|
||||||
|
forceActive = true;
|
||||||
|
} else {
|
||||||
|
item.active = undefined;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
return items.concat(extraItems);
|
if (forceActive) {
|
||||||
|
items.forEach(i => {
|
||||||
|
if (i.active === undefined) {
|
||||||
|
i.active = false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return items;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user