UNPKG

cspace-ui

Version:
181 lines (154 loc) 4.03 kB
import React, { Component } from 'react'; import PropTypes from 'prop-types'; import { defineMessages, FormattedMessage, intlShape } from 'react-intl'; import { Modal } from 'cspace-layout'; import { components as inputComponents } from 'cspace-input'; import CancelButton from '../navigation/CancelButton'; import SearchPinButton from './SearchPinButton'; import styles from '../../../styles/cspace-ui/PinQueryModal.css'; const { LineInput, MultilineInput } = inputComponents; const messages = defineMessages({ title: { id: 'pinQueryModal.title', description: 'Title of the pin query modal.', defaultMessage: 'Pin Query', }, name: { id: 'pinQueryModal.name', description: 'Label of the name field in the pin query modal.', defaultMessage: 'Name', }, description: { id: 'pinQueryModal.description', description: 'Label of the description field in the pin query modal.', defaultMessage: 'Description', }, cancel: { id: 'pinQueryModal.cancel', description: 'Label of the cancel button in the pin query modal.', defaultMessage: 'Cancel', }, }); const propTypes = { isOpen: PropTypes.bool, pinQuery: PropTypes.func, onQueryPinned: PropTypes.func, onCancelButtonClick: PropTypes.func, onCloseButtonClick: PropTypes.func, }; const contextTypes = { intl: intlShape, }; export default class PinQueryModal extends Component { constructor(props) { super(props); this.handleDescriptionCommit = this.handleDescriptionCommit.bind(this); this.handleNameCommit = this.handleNameCommit.bind(this); this.handlePinButtonClick = this.handlePinButtonClick.bind(this); this.renderButtonBar = this.renderButtonBar.bind(this); this.state = { name: '', description: '', }; } // eslint-disable-next-line camelcase UNSAFE_componentWillReceiveProps(nextProps) { const { isOpen, } = this.props; const { isOpen: nextIsOpen, } = nextProps; if (!isOpen && nextIsOpen) { this.setState({ name: '', description: '', }); } } handleNameCommit(path, value) { this.setState({ name: value || '', }); } handleDescriptionCommit(path, value) { this.setState({ description: value || '', }); } handlePinButtonClick() { const { pinQuery, onQueryPinned, } = this.props; const { name, description, } = this.state; if (pinQuery) { pinQuery(name, description); } if (onQueryPinned) { onQueryPinned(); } } renderButtonBar() { const { onCancelButtonClick, } = this.props; const { name, } = this.state; return ( <div> <CancelButton label={<FormattedMessage {...messages.cancel} />} onClick={onCancelButtonClick} /> <SearchPinButton disabled={!name.trim()} onClick={this.handlePinButtonClick} /> </div> ); } render() { const { isOpen, onCloseButtonClick, } = this.props; const { name, description, } = this.state; const { intl, } = this.context; return ( <Modal className={styles.common} isOpen={isOpen} title={<h1><FormattedMessage {...messages.title} /></h1>} closeButtonClassName="material-icons" closeButtonLabel="close" renderButtonBar={this.renderButtonBar} onCloseButtonClick={onCloseButtonClick} > <LineInput id="pinQueryModal-name" label={intl.formatMessage(messages.name)} value={name} onCommit={this.handleNameCommit} /> <MultilineInput id="pinQueryModal-description" label={intl.formatMessage(messages.description)} value={description} onCommit={this.handleDescriptionCommit} /> </Modal> ); } } PinQueryModal.propTypes = propTypes; PinQueryModal.contextTypes = contextTypes;