// PermissionsEditor: Component for editing permissions // import React from 'react'; import { FormattedMessage, defineMessages, injectIntl } from 'react-intl'; import CheckBox from './checkbox.jsx'; import Contact from './contact.jsx'; import { makeImageDataUrl } from '../lib/blob-helpers.js'; // Translatable permission names. const messages = defineMessages({ joiner: { id: 'permission_join', defaultMessage: "Join ({val})", description: 'Name of J permission' }, reader: { id: 'permission_read', defaultMessage: "Read ({val})", description: 'Name of R permission' }, writer: { id: 'permission_write', defaultMessage: "Write ({val})", description: 'Name of W permission' }, preser: { id: 'permission_pres', defaultMessage: "Get notified ({val})", description: 'Name of P permission' }, approver: { id: 'permission_admin', defaultMessage: "Approve ({val})", description: 'Name of A permission' }, sharer: { id: 'permission_share', defaultMessage: "Share ({val})", description: 'Name of S permission' }, deleter: { id: 'permission_delete', defaultMessage: "Delete ({val})", description: 'Name of D permission' }, owner: { id: 'permission_owner', defaultMessage: "Owner ({val})", description: 'Name of O permission' } }); class PermissionsEditor extends React.Component { constructor(props) { super(props); this.state = { mode: (props.mode || '').replace('N', '') }; this.handleChange = this.handleChange.bind(this); this.handleSubmit = this.handleSubmit.bind(this); this.handleCancel = this.handleCancel.bind(this); } handleChange(val) { let mode = this.state.mode; let idx = mode.indexOf(val); if (idx == -1) { mode += val; } else { mode = mode.replace(val, ''); } this.setState({mode: mode}); } handleSubmit() { // Normalize string, otherwise cannot check if mode has changed. var mode = (this.state.mode || 'N').split('').sort().join(''); var before = (this.props.mode || 'N').split('').sort().join('') if (mode !== before) { this.props.onSubmit(mode); } else { this.props.onCancel(); } } handleCancel() { this.props.onCancel(); } render() { const {formatMessage} = this.props.intl; const all = 'JRWPASDO'; const names = { 'J': formatMessage(messages.joiner, {val: 'J'}), 'R': formatMessage(messages.reader, {val: 'R'}), 'W': formatMessage(messages.writer, {val: 'W'}), 'P': formatMessage(messages.preser, {val: 'P'}), 'A': formatMessage(messages.approver, {val: 'A'}), 'S': formatMessage(messages.sharer, {val: 'S'}), 'D': formatMessage(messages.deleter, {val: 'D'}), 'O': formatMessage(messages.owner, {val: 'O'}) }; let skip = this.props.skip || ''; let mode = this.state.mode; let compare = (this.props.compare || '').replace('N', ''); let items = []; for (let i=0; i= 0 && mode.indexOf(c) < 0) { // Permission is marked as inactive: hide unchecked permissions, disable checked permissions continue; } items.push( {names[c]} {skip.indexOf(c) < 0 ? = 0)} onChange={this.handleChange}/> : = 0)} /> }{this.props.compare ? = 0)}/> : null} ); } return ( {this.props.userTitle ? : null} {this.props.compare ? {this.props.modeTitle} {this.props.compareTitle} : null} {items} ); } }; export default injectIntl(PermissionsEditor);