mirror of
https://github.com/codeninjasllc/discourse.git
synced 2025-02-17 04:01:29 -05:00
Add a store
so we can start using ES6 modules for models, finally.
This commit is contained in:
parent
8d46de4819
commit
d8c616a68a
7 changed files with 99 additions and 32 deletions
|
@ -1,6 +1,6 @@
|
||||||
export default Ember.Route.extend({
|
export default Ember.Route.extend({
|
||||||
model() {
|
model() {
|
||||||
return Discourse.ajax("/admin/plugins.json").then(res => res.plugins);
|
return this.store.findAll('plugin');
|
||||||
},
|
},
|
||||||
|
|
||||||
actions: {
|
actions: {
|
||||||
|
|
46
app/assets/javascripts/discourse/adapters/rest.js.es6
Normal file
46
app/assets/javascripts/discourse/adapters/rest.js.es6
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
const ADMIN_MODELS = ['plugin'];
|
||||||
|
|
||||||
|
function plural(type) {
|
||||||
|
return type + 's';
|
||||||
|
}
|
||||||
|
|
||||||
|
function pathFor(type) {
|
||||||
|
const path = "/" + plural(type);
|
||||||
|
|
||||||
|
if (ADMIN_MODELS.indexOf(type) !== -1) {
|
||||||
|
return "/admin/" + path;
|
||||||
|
}
|
||||||
|
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
|
||||||
|
const _identityMap = {};
|
||||||
|
|
||||||
|
export default Ember.Object.extend({
|
||||||
|
findAll(type) {
|
||||||
|
var self = this;
|
||||||
|
return Discourse.ajax(pathFor(type)).then(function(result) {
|
||||||
|
return result[plural(type)].map(obj => self._hydrate(type, obj));
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
_hydrate(type, obj) {
|
||||||
|
if (!obj) { throw "Can't hydrate " + type + " of `null`"; }
|
||||||
|
if (!obj.id) { throw "Can't hydrate " + type + " without an `id`"; }
|
||||||
|
|
||||||
|
_identityMap[type] = _identityMap[type] || {};
|
||||||
|
|
||||||
|
const existing = _identityMap[type][obj.id];
|
||||||
|
if (existing) {
|
||||||
|
delete obj.id;
|
||||||
|
existing.setProperties(obj);
|
||||||
|
return existing;
|
||||||
|
}
|
||||||
|
|
||||||
|
const klass = this.container.lookupFactory('model:' + type) || Ember.Object;
|
||||||
|
const model = klass.create(obj);
|
||||||
|
_identityMap[type][obj.id] = model;
|
||||||
|
return model;
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
|
@ -24,7 +24,7 @@ function loadingResolver(cb) {
|
||||||
function parseName(fullName) {
|
function parseName(fullName) {
|
||||||
/*jshint validthis:true */
|
/*jshint validthis:true */
|
||||||
|
|
||||||
var nameParts = fullName.split(":"),
|
const nameParts = fullName.split(":"),
|
||||||
type = nameParts[0], fullNameWithoutType = nameParts[1],
|
type = nameParts[0], fullNameWithoutType = nameParts[1],
|
||||||
name = fullNameWithoutType,
|
name = fullNameWithoutType,
|
||||||
namespace = get(this, 'namespace'),
|
namespace = get(this, 'namespace'),
|
||||||
|
@ -85,6 +85,10 @@ export default Ember.DefaultResolver.extend({
|
||||||
return module;
|
return module;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
resolveAdapter(parsedName) {
|
||||||
|
return this.customResolve(parsedName) || this._super(parsedName);
|
||||||
|
},
|
||||||
|
|
||||||
resolveView(parsedName) {
|
resolveView(parsedName) {
|
||||||
return this.findLoadingView(parsedName) || this.customResolve(parsedName) || this._super(parsedName);
|
return this.findLoadingView(parsedName) || this.customResolve(parsedName) || this._super(parsedName);
|
||||||
},
|
},
|
||||||
|
|
|
@ -1,48 +1,53 @@
|
||||||
import Session from 'discourse/models/session';
|
import Session from 'discourse/models/session';
|
||||||
import AppEvents from 'discourse/lib/app-events';
|
import AppEvents from 'discourse/lib/app-events';
|
||||||
|
import Store from 'discourse/models/store';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "inject-objects",
|
name: "inject-objects",
|
||||||
initialize: function(container, application) {
|
initialize(container, app) {
|
||||||
|
|
||||||
// Inject appEvents everywhere
|
// Inject appEvents everywhere
|
||||||
var appEvents = AppEvents.create();
|
const appEvents = AppEvents.create();
|
||||||
application.register('app-events:main', appEvents, { instantiate: false });
|
app.register('app-events:main', appEvents, { instantiate: false });
|
||||||
|
|
||||||
application.inject('controller', 'appEvents', 'app-events:main');
|
app.inject('controller', 'appEvents', 'app-events:main');
|
||||||
application.inject('component', 'appEvents', 'app-events:main');
|
app.inject('component', 'appEvents', 'app-events:main');
|
||||||
application.inject('route', 'appEvents', 'app-events:main');
|
app.inject('route', 'appEvents', 'app-events:main');
|
||||||
application.inject('view', 'appEvents', 'app-events:main');
|
app.inject('view', 'appEvents', 'app-events:main');
|
||||||
application.inject('model', 'appEvents', 'app-events:main');
|
app.inject('model', 'appEvents', 'app-events:main');
|
||||||
Discourse.URL.appEvents = appEvents;
|
Discourse.URL.appEvents = appEvents;
|
||||||
|
|
||||||
// Inject Discourse.Site to avoid using Discourse.Site.current()
|
// Inject Discourse.Site to avoid using Discourse.Site.current()
|
||||||
var site = Discourse.Site.current();
|
const site = Discourse.Site.current();
|
||||||
application.register('site:main', site, { instantiate: false });
|
app.register('site:main', site, { instantiate: false });
|
||||||
application.inject('controller', 'site', 'site:main');
|
app.inject('controller', 'site', 'site:main');
|
||||||
application.inject('component', 'site', 'site:main');
|
app.inject('component', 'site', 'site:main');
|
||||||
application.inject('route', 'site', 'site:main');
|
app.inject('route', 'site', 'site:main');
|
||||||
application.inject('view', 'site', 'site:main');
|
app.inject('view', 'site', 'site:main');
|
||||||
application.inject('model', 'site', 'site:main');
|
app.inject('model', 'site', 'site:main');
|
||||||
|
|
||||||
// Inject Discourse.SiteSettings to avoid using Discourse.SiteSettings globals
|
// Inject Discourse.SiteSettings to avoid using Discourse.SiteSettings globals
|
||||||
application.register('site-settings:main', Discourse.SiteSettings, { instantiate: false });
|
app.register('site-settings:main', Discourse.SiteSettings, { instantiate: false });
|
||||||
application.inject('controller', 'siteSettings', 'site-settings:main');
|
app.inject('controller', 'siteSettings', 'site-settings:main');
|
||||||
application.inject('component', 'siteSettings', 'site-settings:main');
|
app.inject('component', 'siteSettings', 'site-settings:main');
|
||||||
application.inject('route', 'siteSettings', 'site-settings:main');
|
app.inject('route', 'siteSettings', 'site-settings:main');
|
||||||
application.inject('view', 'siteSettings', 'site-settings:main');
|
app.inject('view', 'siteSettings', 'site-settings:main');
|
||||||
application.inject('model', 'siteSettings', 'site-settings:main');
|
app.inject('model', 'siteSettings', 'site-settings:main');
|
||||||
|
|
||||||
// Inject Session for transient data
|
// Inject Session for transient data
|
||||||
application.register('session:main', Session.current(), { instantiate: false });
|
app.register('session:main', Session.current(), { instantiate: false });
|
||||||
application.inject('controller', 'session', 'session:main');
|
app.inject('controller', 'session', 'session:main');
|
||||||
application.inject('component', 'session', 'session:main');
|
app.inject('component', 'session', 'session:main');
|
||||||
application.inject('route', 'session', 'session:main');
|
app.inject('route', 'session', 'session:main');
|
||||||
application.inject('view', 'session', 'session:main');
|
app.inject('view', 'session', 'session:main');
|
||||||
application.inject('model', 'session', 'session:main');
|
app.inject('model', 'session', 'session:main');
|
||||||
|
|
||||||
// Inject currentUser. Components only for now to prevent any breakage
|
// Inject currentUser. Components only for now to prevent any breakage
|
||||||
application.register('current-user:main', Discourse.User.current(), { instantiate: false });
|
app.register('current-user:main', Discourse.User.current(), { instantiate: false });
|
||||||
application.inject('component', 'currentUser', 'current-user:main');
|
app.inject('component', 'currentUser', 'current-user:main');
|
||||||
|
|
||||||
|
app.register('store:main', Store);
|
||||||
|
app.inject('route', 'store', 'store:main');
|
||||||
|
app.inject('controller', 'store', 'store:main');
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
6
app/assets/javascripts/discourse/models/store.js.es6
Normal file
6
app/assets/javascripts/discourse/models/store.js.es6
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
export default Ember.Object.extend({
|
||||||
|
findAll(type) {
|
||||||
|
const adapter = this.container.lookup('adapter:' + type) || this.container.lookup('adapter:rest');
|
||||||
|
return adapter.findAll(type);
|
||||||
|
}
|
||||||
|
});
|
|
@ -24,6 +24,7 @@
|
||||||
//= require ./discourse/lib/autocomplete
|
//= require ./discourse/lib/autocomplete
|
||||||
//= require ./discourse/lib/after-transition
|
//= require ./discourse/lib/after-transition
|
||||||
//= require ./discourse/lib/debounce
|
//= require ./discourse/lib/debounce
|
||||||
|
//= require_tree ./discourse/adapters
|
||||||
//= require ./discourse/models/model
|
//= require ./discourse/models/model
|
||||||
//= require ./discourse/models/user_action
|
//= require ./discourse/models/user_action
|
||||||
//= require ./discourse/models/composer
|
//= require ./discourse/models/composer
|
||||||
|
|
|
@ -1,9 +1,14 @@
|
||||||
class AdminPluginSerializer < ApplicationSerializer
|
class AdminPluginSerializer < ApplicationSerializer
|
||||||
attributes :name,
|
attributes :id,
|
||||||
|
:name,
|
||||||
:version,
|
:version,
|
||||||
:url,
|
:url,
|
||||||
:admin_route
|
:admin_route
|
||||||
|
|
||||||
|
def id
|
||||||
|
object.metadata.name
|
||||||
|
end
|
||||||
|
|
||||||
def name
|
def name
|
||||||
object.metadata.name
|
object.metadata.name
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue