diff options
| -rw-r--r-- | app/node_modules/okadminview/index.js | 67 | ||||
| -rw-r--r-- | app/node_modules/okadminview/package.json | 1 | ||||
| -rw-r--r-- | app/node_modules/okschema/index.js | 10 | ||||
| -rw-r--r-- | themes/okadmin/templates/partials/errors.liquid | 10 | ||||
| -rw-r--r-- | themes/okadmin/templates/resource.liquid | 2 | ||||
| -rw-r--r-- | themes/okadmin/templates/resource_new.liquid | 2 |
6 files changed, 52 insertions, 40 deletions
diff --git a/app/node_modules/okadminview/index.js b/app/node_modules/okadminview/index.js index 1dcc0d6..8b17995 100644 --- a/app/node_modules/okadminview/index.js +++ b/app/node_modules/okadminview/index.js @@ -1,3 +1,4 @@ +var assign = require('object-assign') var bodyParser = require('body-parser'); var methodOverride = require('method-override'); var Q = require('q'); @@ -108,7 +109,6 @@ function OKAdminView(options) { } }); - router.get('/:type/:id/', function readResource(req, res, next) { var type = req.params.type || ''; var id = req.params.id || ''; @@ -120,7 +120,7 @@ function OKAdminView(options) { resource: resource, query: id }); - fetchResourceTemplateData(meta, query, transform).then(function(data) { + fetchResourceTemplateData(meta, query, getResourceTemplateData).then(function(data) { if (!data) { resourceMissingHandler(req, res)() } else { @@ -129,25 +129,6 @@ function OKAdminView(options) { }).fail(errorHandler(req, res)); } - function transform(meta, resource, data) { - meta = meta || {}; - resource = resource || {}; - data = data || {}; - var spec = Object.keys(resource.spec).reduce(function(cache, prop) { - var propSpec = resource.spec[prop]; - var value = data[prop]; - cache[prop].id = data[resource.idField]; - cache[prop].value = value; - return cache; - }, resource.spec); - return { - meta: meta, - resource: { - type: resource.type, - spec: spec - } - }; - } }); router.post('/:type/', function createResource(req, res, next) { @@ -158,21 +139,14 @@ function OKAdminView(options) { errorHandler(req, res)(new Error('No such resource ' + type)); } else { meta.get().then(function(metadata) { - var templateData = { - meta: metadata, - resource: { - type: resource.type, - spec: resource.spec, - data: data - } - }; try { resource.assertValid(data); resource.create(data).then(function(created) { res.redirect(303, data[resource.idField]); }).fail(errorHandler(req, res)); } catch (errors) { - view.renderResource(req, res, templateData); + var templateData = getResourceTemplateData(metadata, resource, data); + view.renderResource(req, res, assign(templateData, {errors: errors})); } }).fail(errorHandler(req, res));; } @@ -188,20 +162,14 @@ function OKAdminView(options) { } else { // TODO Prob should make metadata synchronous... meta.get().then(function(metadata) { - var templateData = { - meta: metadata, - resource: { - spec: resource.spec, - data: data - } - }; try { resource.assertValid(data); resource.update(id, data).then(function(updated) { res.redirect(303, '../' + updated[resource.idField]); }).fail(errorHandler(req, res)); } catch (errors) { - view.renderResource(req, res, templateData); + var templateData = getResourceTemplateData(metadata, resource, data); + view.renderResource(req, res, assign(templateData, {errors: errors})); } }).fail(errorHandler(req, res)); } @@ -211,6 +179,29 @@ function OKAdminView(options) { } } +/** + * Get template data for a single resource + */ +function getResourceTemplateData(meta, resource, data) { + meta = meta || {}; + resource = resource || {}; + data = data || {}; + var spec = Object.keys(resource.spec).reduce(function(cache, prop) { + var propSpec = resource.spec[prop]; + var value = data[prop]; + cache[prop].id = data[resource.idField]; + cache[prop].value = value; + return cache; + }, resource.spec); + return { + meta: meta, + resource: { + type: resource.type, + spec: spec + } + }; +} + OKAdminView.prototype.middleware = function() { return this._middleware; }; diff --git a/app/node_modules/okadminview/package.json b/app/node_modules/okadminview/package.json index b07cb1a..4832db1 100644 --- a/app/node_modules/okadminview/package.json +++ b/app/node_modules/okadminview/package.json @@ -11,6 +11,7 @@ "dependencies": { "body-parser": "^1.12.2", "method-override": "^2.3.2", + "object-assign": "^2.0.0", "pluralize": "^1.1.2", "q": "^1.2.0" } diff --git a/app/node_modules/okschema/index.js b/app/node_modules/okschema/index.js index 0829807..4e8ea73 100644 --- a/app/node_modules/okschema/index.js +++ b/app/node_modules/okschema/index.js @@ -24,8 +24,14 @@ var types = { 'enum': { parent: {type: 'string'}, assertValid: function(spec, value) { - if (~spec.options.indexOf(value)) { - throw [] + value = value || ''; + if (spec.options.indexOf(value.trim()) === -1) { + throw [{ + constraint: 'enum', + actual: value, + expected: JSON.stringify(spec.options), + message: 'Invalid value' + }]; } } } diff --git a/themes/okadmin/templates/partials/errors.liquid b/themes/okadmin/templates/partials/errors.liquid new file mode 100644 index 0000000..cdb0b25 --- /dev/null +++ b/themes/okadmin/templates/partials/errors.liquid @@ -0,0 +1,10 @@ +<div class="errors"> + {% for error in errors %} + <div class="error"> + <div class="message">{{error.message}}</div> + <div class="assertion"> + Expected {{error.expected}} but got {{error.actual}} + </div> + </div> + {% endfor %} +</div> diff --git a/themes/okadmin/templates/resource.liquid b/themes/okadmin/templates/resource.liquid index 26d62f2..49ccc7c 100644 --- a/themes/okadmin/templates/resource.liquid +++ b/themes/okadmin/templates/resource.liquid @@ -1,5 +1,7 @@ {% include 'partials/head' %} +{% include 'partials/errors' %} + <nav> <a href="../..">Back</a> </nav> diff --git a/themes/okadmin/templates/resource_new.liquid b/themes/okadmin/templates/resource_new.liquid index 400d670..c57dd83 100644 --- a/themes/okadmin/templates/resource_new.liquid +++ b/themes/okadmin/templates/resource_new.liquid @@ -1,5 +1,7 @@ {% include 'partials/head' %} +{% include 'partials/errors' %} + <nav> <a href="../..">Back</a> </nav> |
