This repository has been archived on 2023-03-18. You can view files and clone it, but cannot push or open issues or pull requests.
osr-discourse-src/app/assets/javascripts/discourse/lib/plugin-connectors.js.es6
2018-06-15 17:03:24 +02:00

109 lines
2.9 KiB
JavaScript

let _connectorCache;
let _rawConnectorCache;
let _extraConnectorClasses = {};
let _classPaths;
export function resetExtraClasses() {
_extraConnectorClasses = {};
_classPaths = undefined;
}
// Note: In plugins, define a class by path and it will be wired up automatically
// eg: discourse/connectors/<OUTLET NAME>/<CONNECTOR NAME>.js.es6
export function extraConnectorClass(name, obj) {
_extraConnectorClasses[name] = obj;
}
const DefaultConnectorClass = {
actions: {},
shouldRender: () => true,
setupComponent() {}
};
function findOutlets(collection, callback) {
const disabledPlugins = Discourse.Site.currentProp("disabled_plugins") || [];
Object.keys(collection).forEach(function(res) {
if (res.indexOf("/connectors/") !== -1) {
// Skip any disabled plugins
for (let i = 0; i < disabledPlugins.length; i++) {
if (res.indexOf("/" + disabledPlugins[i] + "/") !== -1) {
return;
}
}
const segments = res.split("/");
let outletName = segments[segments.length - 2];
const uniqueName = segments[segments.length - 1];
callback(outletName, res, uniqueName);
}
});
}
export function clearCache() {
_connectorCache = null;
_rawConnectorCache = null;
}
function findClass(outletName, uniqueName) {
if (!_classPaths) {
_classPaths = {};
findOutlets(require._eak_seen, (outlet, res, un) => {
_classPaths[`${outlet}/${un}`] = requirejs(res).default;
});
}
const id = `${outletName}/${uniqueName}`;
let foundClass = _extraConnectorClasses[id] || _classPaths[id];
return foundClass
? jQuery.extend({}, DefaultConnectorClass, foundClass)
: DefaultConnectorClass;
}
function buildConnectorCache() {
_connectorCache = {};
findOutlets(Ember.TEMPLATES, (outletName, resource, uniqueName) => {
_connectorCache[outletName] = _connectorCache[outletName] || [];
_connectorCache[outletName].push({
templateName: resource.replace("javascripts/", ""),
template: Ember.TEMPLATES[resource],
classNames: `${outletName}-outlet ${uniqueName}`,
connectorClass: findClass(outletName, uniqueName)
});
});
}
function buildRawConnectorCache() {
_rawConnectorCache = {};
findOutlets(Discourse.RAW_TEMPLATES, (outletName, resource) => {
_rawConnectorCache[outletName] = _rawConnectorCache[outletName] || [];
_rawConnectorCache[outletName].push({
template: Discourse.RAW_TEMPLATES[resource]
});
});
}
export function connectorsFor(outletName) {
if (!_connectorCache) {
buildConnectorCache();
}
return _connectorCache[outletName] || [];
}
export function renderedConnectorsFor(outletName, args, context) {
return connectorsFor(outletName).filter(con => {
return con.connectorClass.shouldRender(args, context);
});
}
export function rawConnectorsFor(outletName) {
if (!_rawConnectorCache) {
buildRawConnectorCache();
}
return _rawConnectorCache[outletName] || [];
}