From b6e03116baf4678ad93160fe2380b3d1730e486e Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Mon, 12 Dec 2016 13:07:33 -0500 Subject: [PATCH] Auto discover connector classes. Support a setup method --- .../components/plugin-connector.js.es6 | 3 ++ .../discourse/components/plugin-outlet.js.es6 | 2 +- .../discourse/lib/plugin-connectors.js.es6 | 28 ++++++++++++++----- .../discourse/lib/show-modal.js.es6 | 28 ++++++++----------- .../inject-discourse-objects.js.es6 | 2 +- 5 files changed, 38 insertions(+), 25 deletions(-) diff --git a/app/assets/javascripts/discourse/components/plugin-connector.js.es6 b/app/assets/javascripts/discourse/components/plugin-connector.js.es6 index 2773e642f7a..21be7a7622c 100644 --- a/app/assets/javascripts/discourse/components/plugin-connector.js.es6 +++ b/app/assets/javascripts/discourse/components/plugin-connector.js.es6 @@ -8,6 +8,9 @@ export default Ember.Component.extend({ const args = this.get('args') || {}; Object.keys(args).forEach(key => this.set(key, args[key])); + + const connectorClass = this.get('connector.connectorClass'); + connectorClass.setupComponent.call(this, args, this); }, send(name, ...args) { diff --git a/app/assets/javascripts/discourse/components/plugin-outlet.js.es6 b/app/assets/javascripts/discourse/components/plugin-outlet.js.es6 index 5fd2d2a77c6..91bf45560e9 100644 --- a/app/assets/javascripts/discourse/components/plugin-outlet.js.es6 +++ b/app/assets/javascripts/discourse/components/plugin-outlet.js.es6 @@ -42,7 +42,7 @@ export default Ember.Component.extend({ if (name) { const args = this.get('args'); const connectors = connectorsFor(name).filter(con => { - return con.connectorClass.shouldRender(args); + return con.connectorClass.shouldRender(args, this); }); this.set('connectors', connectors); diff --git a/app/assets/javascripts/discourse/lib/plugin-connectors.js.es6 b/app/assets/javascripts/discourse/lib/plugin-connectors.js.es6 index a3eb73699a7..73ed1d9678d 100644 --- a/app/assets/javascripts/discourse/lib/plugin-connectors.js.es6 +++ b/app/assets/javascripts/discourse/lib/plugin-connectors.js.es6 @@ -1,8 +1,10 @@ let _connectorCache; 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 @@ -13,7 +15,8 @@ export function extraConnectorClass(name, obj) { const DefaultConnectorClass = { actions: {}, - shouldRender: () => true + shouldRender: () => true, + setupComponent() { } }; function findOutlets(collection, callback) { @@ -41,22 +44,33 @@ export function clearCache() { _connectorCache = null; } +function findClass(outletName, uniqueName) { + if (!_classPaths) { + _classPaths = {}; + findOutlets(require._eak_seen, (outlet, res, un) => { + _classPaths[`${outlet}/${un}`] = require(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, function(outletName, resource, uniqueName) { _connectorCache[outletName] = _connectorCache[outletName] || []; - const foundClass = _extraConnectorClasses[`${outletName}/${uniqueName}`]; - const connectorClass = foundClass ? - jQuery.extend({}, DefaultConnectorClass, foundClass) : - DefaultConnectorClass; - _connectorCache[outletName].push({ templateName: resource.replace('javascripts/', ''), template: Ember.TEMPLATES[resource], classNames: `${outletName}-outlet ${uniqueName}`, - connectorClass + connectorClass: findClass(outletName, uniqueName) }); }); } diff --git a/app/assets/javascripts/discourse/lib/show-modal.js.es6 b/app/assets/javascripts/discourse/lib/show-modal.js.es6 index c0a50a83044..ed2457e065f 100644 --- a/app/assets/javascripts/discourse/lib/show-modal.js.es6 +++ b/app/assets/javascripts/discourse/lib/show-modal.js.es6 @@ -11,26 +11,22 @@ export default function(name, opts) { const controllerName = opts.admin ? `modals/${name}` : name; - const viewClass = container.lookupFactory('view:' + name); const controller = container.lookup('controller:' + controllerName); - if (viewClass) { - route.render(name, { into: 'modal', outlet: 'modalBody' }); - } else { - const templateName = opts.templateName || Ember.String.dasherize(name); + const templateName = opts.templateName || Ember.String.dasherize(name); - const renderArgs = { into: 'modal', outlet: 'modalBody'}; - if (controller) { renderArgs.controller = controllerName; } + const renderArgs = { into: 'modal', outlet: 'modalBody'}; + if (controller) { renderArgs.controller = controllerName; } - if (opts.addModalBodyView) { - renderArgs.view = 'modal-body'; - } + if (opts.addModalBodyView) { + renderArgs.view = 'modal-body'; + } - const modalName = `modal/${templateName}`; - const fullName = opts.admin ? `admin/templates/${modalName}` : modalName; - route.render(fullName, renderArgs); - if (opts.title) { - modalController.set('title', I18n.t(opts.title)); - } + + const modalName = `modal/${templateName}`; + const fullName = opts.admin ? `admin/templates/${modalName}` : modalName; + route.render(fullName, renderArgs); + if (opts.title) { + modalController.set('title', I18n.t(opts.title)); } if (controller) { diff --git a/app/assets/javascripts/discourse/pre-initializers/inject-discourse-objects.js.es6 b/app/assets/javascripts/discourse/pre-initializers/inject-discourse-objects.js.es6 index 5e3de23fee3..51849ef4025 100644 --- a/app/assets/javascripts/discourse/pre-initializers/inject-discourse-objects.js.es6 +++ b/app/assets/javascripts/discourse/pre-initializers/inject-discourse-objects.js.es6 @@ -17,7 +17,7 @@ function inject() { } function injectAll(app, name) { - inject(app, name, 'controller', 'component', 'route', 'view', 'model', 'adapter'); + inject(app, name, 'controller', 'component', 'route', 'model', 'adapter'); } export default {