blob: 793a42074af9c067a357e3f1da42147429f0c9e4 [file] [log] [blame]
/*!
* Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing
* permissions and limitations under the License.
*/
import React, { Component } from 'react';
import ListGroupItem from 'react-bootstrap/lib/ListGroupItem.js';
import i18n from 'nfvo-utils/i18n/i18n.js';
import { SVGIcon } from 'onap-ui-react';
import { Collapse } from 'react-bootstrap';
/**
* parsing and showing the following Java Response object
*
* public class ValidationResponse {
private boolean valid = true;
private Collection<ErrorCode> vspErrors;
private Collection<ErrorCode> licensingDataErrors;
private Map<String, List<ErrorMessage>> uploadDataErrors;
private Map<String, List<ErrorMessage>> compilationErrors;
private QuestionnaireValidationResult questionnaireValidationResult;
}
* public class ErrorCode {
private String id;
private String message;
private ErrorCategory category;
}
* public class ErrorMessage {
private final ErrorLevel level;
private final String message;
}
*/
class SubmitErrorResponse extends Component {
render() {
let {
validationResponse: {
vspErrors,
licensingDataErrors,
questionnaireValidationResult,
uploadDataErrors
}
} = this.props;
return (
<div className="submit-error-response-view">
{vspErrors && this.renderVspErrors(vspErrors)}
{licensingDataErrors &&
this.renderVspErrors(licensingDataErrors)}
{questionnaireValidationResult &&
this.renderComponentsErrors(questionnaireValidationResult)}
{uploadDataErrors &&
this.renderUploadDataErrors(uploadDataErrors)}
</div>
);
}
renderVspErrors(errors) {
return (
<ErrorBlock errorType={i18n('VSP Errors')}>
<div>
{errors.length &&
errors.map((error, i) => {
return (
<ErrorMessage key={i} error={error.message} />
);
})}
</div>
</ErrorBlock>
);
}
renderComponentsErrors(errors) {
return (
<ErrorBlock errorType={i18n('Components Errors')}>
<div>
{errors.validationData.length &&
errors.validationData.map((item, i) => {
return <ComponentError key={i} item={item} />;
})}
</div>
</ErrorBlock>
);
}
renderUploadDataErrors(uploadDataErrors) {
return (
<ErrorBlock errorType={i18n('Upload Data Errors')}>
<div>
<UploadErrorList items={uploadDataErrors} />
</div>
</ErrorBlock>
);
}
}
const ComponentError = ({ item }) => {
return (
<div>
<div className="component-name-header">{item.entityName}</div>
{item.errors.map((error, i) => {
return <ErrorMessage key={i} error={error} />;
})}
</div>
);
};
function* entries(obj) {
for (let key of Object.keys(obj)) {
yield { header: key, list: obj[key] };
}
}
const UploadErrorList = ({ items }) => {
let generator = entries(items);
let errors = [];
for (let item of generator) {
errors.push(
<div key={item.header}>
<div className="component-name-header">{item.header}</div>
{item.list.map((error, i) => (
<ErrorMessage
key={i}
warning={error.level === 'WARNING'}
error={error.message}
/>
))}
</div>
);
}
return <div>{errors}</div>;
};
class ErrorBlock extends React.Component {
state = {
collapsed: false
};
render() {
let { errorType, children } = this.props;
return (
<div className="error-block">
<ErrorHeader
collapsed={this.state.collapsed}
onClick={() => {
this.setState({ collapsed: !this.state.collapsed });
}}
errorType={errorType}
/>
<Collapse in={this.state.collapsed}>{children}</Collapse>
</div>
);
}
}
const ErrorHeader = ({ errorType, collapsed, onClick }) => {
return (
<div onClick={onClick} className="error-block-header">
<SVGIcon
iconClassName={collapsed ? '' : 'collapse-right'}
name="chevronDown"
label={errorType}
labelPosition="right"
/>
</div>
);
};
const ErrorMessage = ({ error, warning }) => {
return (
<ListGroupItem className="error-code-list-item">
<SVGIcon
name={warning ? 'exclamationTriangleLine' : 'error'}
color={warning ? 'warning' : 'negative'}
/>
<span className="icon-label">{error}</span>
</ListGroupItem>
);
};
export default SubmitErrorResponse;