import React from 'react'; import '../css/EditProjectDialog.scss'; import FormDialog from './FormDialog'; import PropTypes from 'prop-types'; import ErrorMessage from './ErrorMessage'; import EditPermissionsPanel from './EditPermissionsPanel'; import TagsField from './TagsField'; import { _ } from '../classes/gettext'; class EditProjectDialog extends React.Component { static defaultProps = { projectName: "", projectDescr: "", projectId: -1, projectTags: [], title: _("New Project"), saveLabel: _("Create Project"), savingLabel: _("Creating project..."), saveIcon: "glyphicon glyphicon-plus", deleteWarning: "", show: false, showDuplicate: false, showPermissions: false, onDuplicated: () => {} }; static propTypes = { projectName: PropTypes.string, projectDescr: PropTypes.string, projectId: PropTypes.number, projectTags: PropTypes.array, saveAction: PropTypes.func.isRequired, onShow: PropTypes.func, deleteAction: PropTypes.func, title: PropTypes.string, saveLabel: PropTypes.string, savingLabel: PropTypes.string, saveIcon: PropTypes.string, deleteWarning: PropTypes.string, show: PropTypes.bool, showDuplicate: PropTypes.bool, showPermissions: PropTypes.bool, onDuplicated: PropTypes.func }; constructor(props){ super(props); this.state = { name: props.projectName, descr: props.projectDescr !== null ? props.projectDescr : "", duplicating: false, tags: props.projectTags, error: "", showTagsField: !!props.projectTags.length }; this.reset = this.reset.bind(this); this.getFormData = this.getFormData.bind(this); this.onShow = this.onShow.bind(this); this.handleChange = this.handleChange.bind(this); } reset(){ this.setState({ name: this.props.projectName, descr: this.props.projectDescr, duplicating: false, tags: this.props.projectTags, showTagsField: !!this.props.projectTags.length, error: "" }); } getFormData(){ const res = { name: this.state.name, descr: this.state.descr, tags: this.state.tags }; if (this.editPermissionsPanel){ res.permissions = this.editPermissionsPanel.getPermissions(); } return res; } onShow(){ if (this.editPermissionsPanel) this.editPermissionsPanel.loadPermissions(); this.nameInput.focus(); } show(){ this.dialog.show(); } hide(){ this.dialog.hide(); if (this.duplicateRequest){ this.duplicateRequest.abort(); this.duplicateRequest = null; } } handleChange(field){ return (e) => { let state = {}; state[field] = e.target.value; this.setState(state); } } handleDuplicate = () => { this.setState({duplicating: true}); this.duplicateRequest = $.post(`/api/projects/${this.props.projectId}/duplicate/`) .done(json => { if (json.success){ this.hide(); this.props.onDuplicated(json.project); }else{ this.setState({ error: json.error || _("Cannot complete operation.") }); } }) .fail(() => { this.setState({ error: _("Cannot complete operation."), }); }) .always(() => { this.setState({duplicating: false}); this.duplicateRequest = null; }); } toggleTagsField = () => { if (!this.state.showTagsField){ setTimeout(() => { if (this.tagsField) this.tagsField.focus(); }, 0); } this.setState({showTagsField: !this.state.showTagsField}); } render(){ let tagsField = ""; if (this.state.showTagsField){ tagsField = (
this.state.tags = tags } tags={this.state.tags} ref={domNode => this.tagsField = domNode}/>
); } return ( Duplicate] : undefined} ref={(domNode) => { this.dialog = domNode; }}>
{ this.nameInput = domNode; }} value={this.state.name} onChange={this.handleChange('name')} onKeyPress={e => this.dialog.handleEnter(e)} />
{tagsField}