diff options
| author | two hustlers proj <jules+okfprojz@okfoc.us> | 2015-09-22 19:25:19 -0400 |
|---|---|---|
| committer | two hustlers proj <jules+okfprojz@okfoc.us> | 2015-09-22 19:25:19 -0400 |
| commit | 6b19245d0128311603d66d13c4ac606700e8912d (patch) | |
| tree | cb3ea9337c76eebd2713ca18f8e844e47315a0d1 /app/node_modules/okadminview/index.js | |
| parent | e9fb94cd1f6e73201f0f95afde7c40cc3948ee60 (diff) | |
| parent | 96eccfa594fb2526e50d4f9adfa690ea345a29ff (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.js | 157 |
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; |
