Also render violations (if present)

This commit is contained in:
Philipp Czora
2019-03-04 11:09:12 +01:00
parent dadfe4a8af
commit adf92db9b2
2 changed files with 48 additions and 17 deletions

View File

@@ -18,6 +18,7 @@ class BackendErrorNotification extends React.Component<Props> {
<div className="content"> <div className="content">
<p className="subtitle">{this.renderErrorName()}</p> <p className="subtitle">{this.renderErrorName()}</p>
<p>{this.renderErrorDescription()}</p> <p>{this.renderErrorDescription()}</p>
<p>{this.renderViolations()}</p>
{this.renderMetadata()} {this.renderMetadata()}
</div> </div>
</Notification> </Notification>
@@ -42,6 +43,28 @@ class BackendErrorNotification extends React.Component<Props> {
return translation; return translation;
}; };
renderViolations = () => {
const { error, t } = this.props;
if (error.violations) {
return (
<>
<p>
<strong>{t("errors.violations")}</strong>
</p>
<ul>
{error.violations.map((violation, index) => {
return (
<li key={index}>
<strong>{violation.path}:</strong> {violation.message}
</li>
);
})}
</ul>
</>
);
}
};
renderMetadata = () => { renderMetadata = () => {
const { error, t } = this.props; const { error, t } = this.props;
return ( return (
@@ -62,24 +85,25 @@ class BackendErrorNotification extends React.Component<Props> {
renderContext = (error: BackendError) => { renderContext = (error: BackendError) => {
if (error.context) { if (error.context) {
return <> return (
<p> <>
<strong>{t("errors.context")}</strong> <p>
</p> <strong>{t("errors.context")}</strong>
<ul> </p>
{error.context.map((context, index) => { <ul>
return ( {error.context.map((context, index) => {
<li key={index}> return (
<strong>{context.type}:</strong> {context.id} <li key={index}>
</li> <strong>{context.type}:</strong> {context.id}
); </li>
})} );
</ul> })}
</>; </ul>
</>
);
} }
}; };
renderMoreInformationLink = (error: BackendError) => { renderMoreInformationLink = (error: BackendError) => {
const { t } = this.props; const { t } = this.props;
if (error.url) { if (error.url) {

View File

@@ -1,12 +1,14 @@
// @flow // @flow
type Context = { type: string, id: string }[]; type Context = { type: string, id: string }[];
type Violation = { path: string, message: string };
export type BackendErrorContent = { export type BackendErrorContent = {
transactionId: string, transactionId: string,
errorCode: string, errorCode: string,
message: string, message: string,
url?: string, url?: string,
context: Context context: Context,
violations: Violation[]
}; };
export class BackendError extends Error { export class BackendError extends Error {
@@ -15,6 +17,7 @@ export class BackendError extends Error {
url: ?string; url: ?string;
context: Context = []; context: Context = [];
statusCode: number; statusCode: number;
violations: Violation[];
constructor(content: BackendErrorContent, name: string, statusCode: number) { constructor(content: BackendErrorContent, name: string, statusCode: number) {
super(content.message); super(content.message);
@@ -24,6 +27,7 @@ export class BackendError extends Error {
this.url = content.url; this.url = content.url;
this.context = content.context; this.context = content.context;
this.statusCode = statusCode; this.statusCode = statusCode;
this.violations = content.violations;
} }
} }
@@ -53,5 +57,8 @@ export function createBackendError(
} }
export function isBackendError(response: Response) { export function isBackendError(response: Response) {
return response.headers.get("Content-Type") === "application/vnd.scmm-error+json;v=2"; return (
response.headers.get("Content-Type") ===
"application/vnd.scmm-error+json;v=2"
);
} }