blob: 78525f84c642e905f18f70f2442339fd963d924e [file] [log] [blame]
import React from 'react';
import classnames from 'classnames';
import i18n from 'nfvo-utils/i18n/i18n.js';
import Navbar from 'react-bootstrap/lib/Navbar.js';
import Nav from 'react-bootstrap/lib/Nav.js';
import ValidationInput from 'nfvo-components/input/validation/ValidationInput.jsx';
import {actionsEnum, statusEnum} from './VersionControllerConstants.js';
class VersionController extends React.Component {
static propTypes = {
version: React.PropTypes.string,
viewableVersions: React.PropTypes.array,
onVersionSwitching: React.PropTypes.func,
isCheckedOut: React.PropTypes.bool.isRequired,
status: React.PropTypes.string.isRequired,
callVCAction: React.PropTypes.func,
onSave: React.PropTypes.func,
onClose: React.PropTypes.func,
isFormDataValid: React.PropTypes.bool
};
render() {
let {status, isCheckedOut, version = '', viewableVersions = [], onVersionSwitching, callVCAction, onSave, isFormDataValid, onClose} = this.props;
let isCheckedIn = Boolean(status === statusEnum.CHECK_IN_STATUS);
let isLatestVersion = Boolean(version === viewableVersions[viewableVersions.length - 1]);
if (!isLatestVersion) {
status = statusEnum.PREVIOUS_VERSION;
}
return (
<div className='version-controller-bar'>
<Navbar inverse className='navbar'>
<Navbar.Collapse>
<Nav className='items-in-left'>
<div className='version-section'>
<ValidationInput
type='select'
selectedEnum={version}
onEnumChange={value => onVersionSwitching && onVersionSwitching(value)}>
{viewableVersions && viewableVersions.map(viewVersion => {
return (
<option key={viewVersion} value={viewVersion}>{`V ${viewVersion}`}</option>
);
})
}
{!viewableVersions.includes(version) &&
<option key={version} value={version}>{`V ${version}`}</option>}
</ValidationInput>
</div>
<div className='vc-status'>
<div className='onboarding-status-icon'></div>
<div className='status-text'> {i18n('ONBOARDING')}
<div className='status-text-dash'> -</div>
</div>
{this.renderStatus(status)}
</div>
</Nav>
<Nav pullRight>
<div className='items-in-right'>
<div className='action-buttons'>
{callVCAction &&
<div className='version-control-buttons'>
<div
className={classnames('vc-nav-item-button button-submit', {'disabled': !isCheckedIn || !isLatestVersion})}
onClick={() => this.submit(callVCAction)}>
{i18n('Submit')}
</div>
<div
className={classnames('vc-nav-item-button button-checkin-checkout', {'disabled': status === statusEnum.LOCK_STATUS || !isLatestVersion})}
onClick={() => this.checkinCheckoutVersion(callVCAction)}>
{`${isCheckedOut ? i18n('Check In') : i18n('Check Out')}`}
</div>
<div
className={classnames('sprite-new revert-btn ng-scope ng-isolate-scope', {'disabled': !isCheckedOut || version === '0.1' || !isLatestVersion})}
onClick={() => this.revertCheckout(callVCAction)}>
</div>
</div>
}
{onSave &&
<div
className={classnames('sprite-new save-btn ng-scope ng-isolate-scope', {'disabled': !isCheckedOut || !isFormDataValid || !isLatestVersion})}
onClick={() => onSave()}>
</div>
}
</div>
<div className='vc-nav-item-close' onClick={() => onClose && onClose()}> X</div>
</div>
</Nav>
</Navbar.Collapse>
</Navbar>
</div>
);
}
renderStatus(status) {
switch (status) {
case statusEnum.CHECK_OUT_STATUS:
return (
<div className='checkout-status-icon'>
<div className='catalog-tile-check-in-status sprite-new checkout-editable-status-icon'></div>
<div className='status-text'> {i18n('CHECKED OUT')} </div>
</div>
);
case statusEnum.LOCK_STATUS:
return (
<div className='status-text'> {i18n('LOCKED')} </div>
);
case statusEnum.CHECK_IN_STATUS:
return (
<div className='status-text'> {i18n('CHECKED IN')} </div>
);
case statusEnum.SUBMIT_STATUS:
return (
<div className='status-text'> {i18n('SUBMITTED')} </div>
);
default:
return (
<div className='status-text'> {i18n(status)} </div>
);
}
}
checkinCheckoutVersion(callVCAction) {
if (this.props.isCheckedOut) {
this.checkin(callVCAction);
}
else {
this.checkout(callVCAction);
}
}
checkin(callVCAction) {
const action = actionsEnum.CHECK_IN;
if (this.props.onSave) {
this.props.onSave().then(()=>{
callVCAction(action);
});
}else{
callVCAction(action);
}
}
checkout(callVCAction) {
const action = actionsEnum.CHECK_OUT;
callVCAction(action);
}
submit(callVCAction) {
const action = actionsEnum.SUBMIT;
callVCAction(action);
}
revertCheckout(callVCAction) {
const action = actionsEnum.UNDO_CHECK_OUT;
callVCAction(action);
}
}
export default VersionController;