1
0
mirror of https://github.com/ascribe/onion.git synced 2024-06-28 16:48:04 +02:00
onion/js/components/ascribe_buttons/acl_information.js

118 lines
3.8 KiB
JavaScript
Raw Normal View History

2015-10-15 11:17:16 +02:00
'use strict';
import React from 'react';
import classnames from 'classnames';
import { InformationTexts } from '../../constants/information_text';
import { replaceSubstringAtIndex, sanitize } from '../../utils/general_utils';
import { intersectAcls } from '../../utils/acl_utils';
import { getLangText } from '../../utils/lang_utils';
let AclInformation = React.createClass({
propTypes: {
verbs: React.PropTypes.arrayOf(React.PropTypes.string),
aim: React.PropTypes.string.isRequired,
aclObject: React.PropTypes.object
},
getInitialState() {
return { isVisible: false };
},
onOff() {
if(!this.state.isVisible) {
this.setState({ isVisible: true });
}
else {
this.setState({ isVisible: false });
}
},
getInfoText(title, info, example){
let aim = this.props.aim;
if (aim) {
if (aim === 'form') {
return (
2015-10-20 15:10:18 +02:00
<p>
<span className="info">
{replaceSubstringAtIndex(info.slice(2), 's ', ' ')} <br/>
</span>
<span className="example">
{example}
</span>
2015-10-15 11:17:16 +02:00
</p>
);
}
else if (aim === 'button') {
return (
2015-10-20 15:10:18 +02:00
<p>
<span className="title">
{title}
</span>
<span className="info">
{info} <br/>
</span>
<span className="example">
{example}
</span>
2015-10-15 11:17:16 +02:00
</p>
);
}
}
else {
console.log('Aim is required when you want to place information text');
}
},
produceInformationBlock() {
const { titles, informationSentences, exampleSentences } = InformationTexts;
2015-10-20 15:10:18 +02:00
const { verbs, aim } = this.props;
2015-10-15 11:17:16 +02:00
// sorting is not needed, as `this.props.verbs` takes care of sorting already
// So we assume a user of `AclInformationButton` puts an ordered version of
// `verbs` into `propTypes`
let verbsToDisplay = [];
if(aim === 'form') {
verbsToDisplay = verbsToDisplay.concat(verbs);
} else if(aim === 'button' && this.props.aclObject) {
const { aclObject } = this.props;
const sanitizedAclObject = sanitize(aclObject, (val) => !val);
verbsToDisplay = verbsToDisplay.concat(intersectAcls(verbs, Object.keys(sanitizedAclObject)));
} else {
console.warn('AclInformation can only be used with aim === "button" or aim === "form".' +
'For aim === "button", aclObject needs to be defined.');
}
return verbsToDisplay.map((verb) => {
return this.getInfoText(getLangText(titles[verb]), getLangText(informationSentences[verb]), getLangText(exampleSentences[verb]));
});
},
getButton() {
return this.props.aim === 'button' ?
2015-10-20 15:10:18 +02:00
<button
style={{ marginTop: 0 }}
className="btn btn-transparent glyphicon glyphicon-question-sign" onClick={this.onOff} /> :
2015-10-15 11:17:16 +02:00
null;
},
render() {
2015-10-20 15:10:18 +02:00
const { aim } = this.props;
const { isVisible } = this.state;
2015-10-15 11:17:16 +02:00
return (
2015-10-20 15:10:18 +02:00
<span >
2015-10-15 11:17:16 +02:00
{this.getButton()}
<div
2015-10-20 15:10:18 +02:00
className={classnames({'acl-information-dropdown-list': true, 'hidden': aim === 'button' && !isVisible})}>
2015-10-15 11:17:16 +02:00
<span>{this.produceInformationBlock()}</span>
</div>
</span>
);
}
});
export default AclInformation;