Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 0 additions & 14 deletions api/src/org/labkey/api/view/template/errorView.jsp
Original file line number Diff line number Diff line change
Expand Up @@ -24,19 +24,6 @@

<div id="<%=h(appId)%>"></div>

<%
StringBuilder stackTrace = new StringBuilder();
if (null != model.getException())
{
stackTrace.append(model.getException().toString());
for (StackTraceElement stackTraceElement : model.getException().getStackTrace())
{
stackTrace.append("\n");
stackTrace.append(stackTraceElement.toString());
}
}
%>

<script type="text/javascript" nonce="<%=getScriptNonce()%>">
/*
This error page may be invoked without the themes having been loaded for this container.
Expand All @@ -52,7 +39,6 @@
errorDetails : {
message: <%=q(model.getHeading())%>,
errorType: <%=q(model.getErrorType())%>,
stackTrace: <%=q(stackTrace.toString())%>,
errorCode: <%=q(model.getErrorCode())%>,
advice: <%=q(model.getAdvice())%>
}
Expand Down
4 changes: 0 additions & 4 deletions core/src/client/ErrorHandler/ErrorHandler.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -68,19 +68,15 @@ describe('ErrorHandlerImpl', () => {
});

test('Execution exception', async () => {
const expectedStackTrace = 'java.lang.NullPointerException: null';

const errorDetails: ErrorDetails = {
errorType: ErrorType.execution,
errorCode: '456AAA',
message: 'This is a execution exception',
stackTrace: expectedStackTrace,
};
renderWithAppContext(<ErrorHandlerImpl context={{ errorDetails }} />);
expect(document.querySelector('.labkey-error-subheading').innerHTML.includes(errorDetails.message)).toBeTruthy();
expect(document.querySelectorAll('.error-details-container')).toHaveLength(0);

await userEvent.click(document.querySelectorAll('.error-page-button')[2]);
expect(document.querySelector('pre').innerHTML.startsWith(expectedStackTrace)).toBeTruthy();
});
});
4 changes: 2 additions & 2 deletions core/src/client/ErrorHandler/ErrorHandler.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import React, { PureComponent } from 'react';
import { ActionURL } from '@labkey/api';

import { getErrorHeading, getImage, getInstruction, getSubHeading, getViewDetails } from './ErrorType';
import { getErrorHeading, getImage, getInstruction, getShowDetailsBtn, getSubHeading, getViewDetails } from './ErrorType';
import { ErrorDetails } from './model';
import { withServerContext } from '@labkey/components';

Expand Down Expand Up @@ -61,7 +61,7 @@ export class ErrorHandlerImpl extends PureComponent<ErrorHandlerProps, ErrorHand
<button className="btn btn-default error-page-button" onClick={this.onHomeClick}>
Home
</button>
{!errorDetails.hideViewDetails &&
{!errorDetails.hideViewDetails && getShowDetailsBtn(errorDetails) &&
<button className="btn btn-default error-page-button" onClick={this.onViewDetailsClick}>
{viewDetailsBtnText}
</button>
Expand Down
16 changes: 12 additions & 4 deletions core/src/client/ErrorHandler/ErrorType.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -211,7 +211,6 @@ const CONFIGURATION_DETAILS = (errorDetails: ErrorDetails) => (
</div>

{DETAILS_SUB_INSTRUCTION}
<pre>{errorDetails.stackTrace}</pre>
</>
);

Expand All @@ -231,21 +230,21 @@ const EXECUTION_INSTRUCTION = (errorDetails: ErrorDetails) => (
{' '}
find help resources here{' '}
</a>{' '}
and may find troubleshooting hints by reading the full stack trace in the View Details section
below.
and may find troubleshooting hints by reading the full stack trace in the server logs.
</div>
<div className="labkey-error-instruction">
Your unique reference code is: <b>{errorDetails.errorCode}</b>
</div>
</>
);
const EXECUTION_DETAILS = (errorDetails: ErrorDetails) => <pre>{errorDetails.stackTrace}</pre>;
const EXECUTION_DETAILS = () => null;

type ErrorTypeInfo = {
details: (errorDetails?: ErrorDetails) => ReactNode;
heading: (errorMessage?: string) => ReactNode;
imagePath: string;
instruction: (errorDetails?: ErrorDetails) => ReactNode;
showDetailsBtn: boolean;
subHeading: (errorMessage?: string) => ReactNode;
};

Expand All @@ -257,27 +256,31 @@ const ERROR_TYPE_INFO: { [key in ErrorType]: ErrorTypeInfo } = {
heading: CONFIGURATION_HEADING,
imagePath: 'configuration_error.svg',
instruction: CONFIGURATION_INSTRUCTION,
showDetailsBtn: true,
subHeading: CONFIGURATION_SUBHEADING,
},
execution: {
details: EXECUTION_DETAILS,
heading: ERROR_HEADING,
imagePath: 'code_error.svg',
instruction: EXECUTION_INSTRUCTION,
showDetailsBtn: false,
subHeading: EXECUTION_SUB_HEADING,
},
notFound: {
details: NOTFOUND_DETAILS,
heading: NOTFOUND_HEADING,
imagePath: 'notFound_error.svg',
instruction: NOTFOUND_INSTRUCTION,
showDetailsBtn: true,
subHeading: NOTFOUND_SUBHEADING,
},
permission: {
details: PERMISSION_DETAILS,
heading: ERROR_HEADING,
imagePath: 'permission_error.svg',
instruction: PERMISSION_INSTRUCTION,
showDetailsBtn: true,
subHeading: PERMISSION_SUBHEADING,
},
};
Expand Down Expand Up @@ -310,6 +313,11 @@ export const getInstruction = (errorDetails: ErrorDetails): ReactNode => {
return <div className="labkey-error-instruction">{info.instruction(errorDetails)}</div>;
};

export const getShowDetailsBtn = (errorDetails: ErrorDetails): boolean => {
const info = ERROR_TYPE_INFO[errorDetails.errorType];
return info?.showDetailsBtn ?? true;
};

export const getViewDetails = (errorDetails: ErrorDetails): ReactNode => {
const info = ERROR_TYPE_INFO[errorDetails.errorType];
if (!info) return null;
Expand Down
1 change: 0 additions & 1 deletion core/src/client/ErrorHandler/model.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ export interface ErrorDetails {
errorCode?: string;
errorType: ErrorType;
message?: string;
stackTrace?: string;
hideViewDetails?: boolean;
advice?: string;
}
Loading