keystone
Version:
Web Application Framework and Admin GUI / Content Management System built on Express.js and Mongoose
98 lines (89 loc) • 2.52 kB
JavaScript
import React from 'react';
import { Alert } from '../elemental';
import { upcase } from '../../utils/string';
/**
* This renders alerts for API success and error responses.
* Error format: {
* error: 'validation errors' // The unique error type identifier
* detail: { ... } // Optional details specific to that error type
* }
* Success format: {
* success: 'item updated', // The unique success type identifier
* details: { ... } // Optional details specific to that success type
* }
* Eventually success and error responses should be handled individually
* based on their type. For example: validation errors should be displayed next
* to each invalid field and signin errors should promt the user to sign in.
*/
var AlertMessages = React.createClass({
displayName: 'AlertMessages',
propTypes: {
alerts: React.PropTypes.shape({
error: React.PropTypes.Object,
success: React.PropTypes.Object,
}),
},
getDefaultProps () {
return {
alerts: {},
};
},
renderValidationErrors () {
let errors = this.props.alerts.error.detail;
if (errors.name === 'ValidationError') {
errors = errors.errors;
}
let errorCount = Object.keys(errors).length;
let alertContent;
let messages = Object.keys(errors).map((path) => {
if (errorCount > 1) {
return (
<li key={path}>
{upcase(errors[path].error || errors[path].message)}
</li>
);
} else {
return (
<div key={path}>
{upcase(errors[path].error || errors[path].message)}
</div>
);
}
});
if (errorCount > 1) {
alertContent = (
<div>
<h4>There were {errorCount} errors creating the new item:</h4>
<ul>{messages}</ul>
</div>
);
} else {
alertContent = messages;
}
return <Alert color="danger">{alertContent}</Alert>;
},
render () {
let { error, success } = this.props.alerts;
if (error) {
// Render error alerts
switch (error.error) {
case 'validation errors':
return this.renderValidationErrors();
case 'error':
if (error.detail.name === 'ValidationError') {
return this.renderValidationErrors();
} else {
return <Alert color="danger">{upcase(error.error)}</Alert>;
}
default:
return <Alert color="danger">{upcase(error.error)}</Alert>;
}
}
if (success) {
// Render success alerts
return <Alert color="success">{upcase(success.success)}</Alert>;
}
return null; // No alerts, render nothing
},
});
module.exports = AlertMessages;