summaryrefslogtreecommitdiff
path: root/app/node_modules/okadminview/index.js
diff options
context:
space:
mode:
authortwo hustlers proj <jules+okfprojz@okfoc.us>2015-09-22 19:25:19 -0400
committertwo hustlers proj <jules+okfprojz@okfoc.us>2015-09-22 19:25:19 -0400
commit6b19245d0128311603d66d13c4ac606700e8912d (patch)
treecb3ea9337c76eebd2713ca18f8e844e47315a0d1 /app/node_modules/okadminview/index.js
parente9fb94cd1f6e73201f0f95afde7c40cc3948ee60 (diff)
parent96eccfa594fb2526e50d4f9adfa690ea345a29ff (diff)
Merge branch 'twohustlers' of github.com:okfocus/okcms into twohustlers
Diffstat (limited to 'app/node_modules/okadminview/index.js')
-rw-r--r--app/node_modules/okadminview/index.js157
1 files changed, 107 insertions, 50 deletions
diff --git a/app/node_modules/okadminview/index.js b/app/node_modules/okadminview/index.js
index 2a0fcd5..06656dc 100644
--- a/app/node_modules/okadminview/index.js
+++ b/app/node_modules/okadminview/index.js
@@ -40,6 +40,8 @@ function OKAdminView(options) {
if (!options.errorHandler)
throw new Error('No error handler provided to OKAdminView');
+ var dashboardConfig = options.dashboardConfig || {}
+ var dashboardResourceConfig = dashboardConfig.resources || {}
var app = options.app;
var express = options.express;
var meta = options.meta;
@@ -79,10 +81,25 @@ function OKAdminView(options) {
var id = resource.getID(staticData);
// Check to see if there's a more specific instance
resource = resourceCache.get(type, id) || resource;
+ var dashConf = dashboardResourceConfig[type] || {}
+ var groupBy = dashConf.groupBy
+ var sortBy = dashConf.sortBy
+ var descending = dashConf.descending
if (resource.bound) {
- return OKQuery({resource: resource});;
+ return OKQuery({
+ resource: resource,
+ groupBy: groupBy,
+ sortBy: sortBy,
+ descending: descending
+ })
} else {
- return OKQuery({resource: resource, query: config.query})
+ return OKQuery({
+ resource: resource,
+ query: config.query,
+ groupBy: groupBy,
+ sortBy: sortBy,
+ descending: descending
+ })
}
});
@@ -118,10 +135,12 @@ function OKAdminView(options) {
// This should really be mounted on the router, but can't be due to
// https://github.com/jaredhanson/passport-http/pull/16
app.use('/admin/', passport.initialize());
- app.all('/admin/:path*', passport.authenticate('digest', {session: false}));
+ app.all('/admin/(:path*)?', passport.authenticate('digest', {
+ session: false
+ }));
router.get('/', function readIndex(req, res, next) {
- fetchIndexTemplateData(meta, indexQueries).then(function(data) {
+ fetchIndexTemplateData(meta, indexQueries, dashboardConfig).then(function(data) {
view.renderIndex(req, res, assign(data, {
success: req.flash('success'),
errors: req.flash('errors')
@@ -135,11 +154,12 @@ function OKAdminView(options) {
if (!resource) {
error(req, res, 404)(new Error('No such resource ' + type));
} else {
- var templateData = transformData(meta, resource, {});
- view.renderResourceNew(req, res, assign(templateData, {
- success: req.flash('success'),
- errors: req.flash('errors'),
- }));
+ fetchNewTemplateData(meta, resource, transformData).then(function(data) {
+ view.renderResourceNew(req, res, assign(data, {
+ success: req.flash('success'),
+ errors: req.flash('errors'),
+ }))
+ }).fail(error(req, res, 500))
}
});
@@ -261,11 +281,11 @@ function OKAdminView(options) {
/**
* Yields formatted template data for a single resource
*/
-function transformData(meta, resource, data) {
+function transformData(meta, spec, resource, data) {
meta = meta || {};
resource = resource || {};
data = data || {};
- var spec = Object.keys(resource.spec).reduce(function(cache, prop) {
+ var spec = Object.keys(spec).reduce(function(cache, prop) {
var value = data[prop];
var propSpec = cache[prop];
// Decorate spec with actual resource values
@@ -275,7 +295,7 @@ function transformData(meta, resource, data) {
propSpec.hidden = true;
}
return cache;
- }, resource.spec);
+ }, spec);
return {
meta: meta,
resource: {
@@ -314,64 +334,101 @@ OKAdminView.prototype.renderResourceNew = function(req, res, data) {
/**
* Annotate template data with schema info
*/
-function fetchIndexTemplateData(meta, queries) {
+function fetchIndexTemplateData(meta, queries, dashboardConfig) {
+ var resourceConfig = dashboardConfig.resources || {}
+
return Q.promise(function(resolve, reject) {
Q.all(queries.map(function(query) {
return query.get();
})).then(function(results) {
- var resources = results.reduce(function(cache, result, i) {
- if (!result)
- return cache;
+ var templateData = results.reduce(function(acc, result, i) {
var resource = queries[i].resource;
// We want the raw object spec
var spec = resource.spec;
- var key = pluralize(resource.type);
- if (!cache[key]) {
- cache[key] = {
- type: resource.type,
- spec: spec,
- data: []
- };
- }
-
- if (result.length) {
- result.forEach(addData)
- } else {
- addData(result);
- }
-
- function addData(data) {
- // Report id to template under standard name
- data.id = resource.getID(data);
- cache[key].data.push(data);
+ var dashConf = resourceConfig[resource.type] || {}
+ var groupBy = dashConf.groupBy
+ var key = pluralize(resource.type)
+ acc[key] = {
+ type: resource.type,
+ spec: spec,
+ data: result,
+ groupBy: groupBy
}
-
- return cache;
- }, {});
-
+ return acc
+ }, {})
resolve({
meta: meta,
- resources: resources
- });
- }).fail(reject);
+ resources: templateData
+ })
+ }).fail(reject)
});
}
+function fetchNewTemplateData(meta, resource, transformFn) {
+ return Q.promise(function(resolve, reject) {
+ if (!resource.hasForeignKey) {
+ done({spec: resource.spec, resource: resource})
+ } else {
+ fetchForeignKeyOptions(resource).then(done).fail(reject)
+ }
+
+ function done(results) {
+ resolve(transformFn(meta, results.spec, results.resource, {}))
+ }
+ })
+}
+
/**
* Annotate template data with schema info
*/
-function fetchResourceTemplateData(meta, query, fn) {
- fn = fn || function(m, r, d) { return {meta: m, resource: d}; };
+function fetchResourceTemplateData(meta, query, transformFn) {
return Q.promise(function(resolve, reject) {
query.get().then(function(data) {
- if (!data) {
- reject(new Error('No resource data'));
+ if (!data)
+ return reject(new Error('No resource data'))
+
+ var resource = query.resource
+
+ if (resource.hasForeignKey) {
+ fetchForeignKeyOptions(resource).then(done).fail(reject)
} else {
- var resource = query.resource;
- resolve(fn(meta, resource, data));
+ done({spec: resource.spec, resource: resource})
}
- }).fail(reject);
- });
+
+ function done(results) {
+ resolve(transformFn(meta, results.spec, results.resource, data))
+ }
+ }).fail(reject)
+ })
}
+function fetchForeignKeyOptions(resource) {
+ var promises = Object.keys(resource.foreignKeys)
+ .map(fetchOptionsForKey)
+ var spec = resource.spec
+
+ return Q.all(promises).then(done)
+
+ function done() {
+ return Q.promise(function(resolve, reject) {
+ resolve({spec: spec, resource: resource})
+ })
+ }
+
+ function fetchOptionsForKey(field) {
+ var relatedResourceType = resource.foreignKeys[field]
+ return resource.related(relatedResourceType).then(fillOptions)
+
+ function fillOptions(results) {
+ return Q.promise(function(resolve, reject) {
+ spec[field].options = results.map(function(result) {
+ return result.id
+ })
+ resolve()
+ })
+ }
+ }
+}
+
+
module.exports = OKAdminView;