import React from 'react'; import PropTypes from 'prop-types'; import { Button, Modal, ModalHeader, Input, ModalBody, ModalFooter, Form, FormGroup, Label, Alert } from 'reactstrap'; import { gettext, enableEncryptedLibrary, repoPasswordMinLength, storages, libraryTemplates } from '../../utils/constants'; import { SeahubSelect } from '../common/select'; const propTypes = { libraryType: PropTypes.string.isRequired, onCreateRepo: PropTypes.func.isRequired, onCreateToggle: PropTypes.func.isRequired, }; class CreateRepoDialog extends React.Component { constructor(props) { super(props); this.state = { repoName: '', disabled: true, encrypt: false, password1: '', password2: '', errMessage: '', permission: 'rw', storage_id: storages.length ? storages[0].id : '', library_template: libraryTemplates.length ? libraryTemplates[0] : '', isSubmitBtnActive: false, }; this.templateOptions = []; this.storageOptions = []; if (Array.isArray(libraryTemplates) && libraryTemplates.length) { this.templateOptions = libraryTemplates.map((item) => { return { value: item, label: item }; }); } if (Array.isArray(storages) && storages.length) { this.storageOptions = storages.map((item) => { return { value: item.id, label: item.name }; }); } } handleRepoNameChange = (e) => { if (!e.target.value.trim()) { this.setState({ isSubmitBtnActive: false }); } else { this.setState({ isSubmitBtnActive: true }); } this.setState({ repoName: e.target.value }); }; handlePassword1Change = (e) => { this.setState({ password1: e.target.value }); }; handlePassword2Change = (e) => { this.setState({ password2: e.target.value }); }; handleSubmit = () => { let isValid = this.validateInputParams(); if (isValid) { let repoData = this.prepareRepoData(); if (this.props.libraryType === 'department') { this.props.onCreateRepo(repoData, 'department'); return; } this.props.onCreateRepo(repoData); } }; handleKeyDown = (e) => { if (e.key === 'Enter') { this.handleSubmit(); e.preventDefault(); } }; toggle = () => { this.props.onCreateToggle(); }; validateInputParams() { let errMessage = ''; let repoName = this.state.repoName.trim(); if (!repoName.length) { errMessage = gettext('Name is required'); this.setState({ errMessage: errMessage }); return false; } if (repoName.indexOf('/') > -1) { errMessage = gettext('Name should not include \'/\'.'); this.setState({ errMessage: errMessage }); return false; } if (this.state.encrypt) { let password1 = this.state.password1.trim(); let password2 = this.state.password2.trim(); if (!password1.length) { errMessage = gettext('Please enter password'); this.setState({ errMessage: errMessage }); return false; } if (!password2.length) { errMessage = gettext('Please enter the password again'); this.setState({ errMessage: errMessage }); return false; } if (password1.length < repoPasswordMinLength) { errMessage = gettext('Password is too short'); this.setState({ errMessage: errMessage }); return false; } if (password1 !== password2) { errMessage = gettext('Passwords don\'t match'); this.setState({ errMessage: errMessage }); return false; } } return true; } onPermissionChange = (e) => { let permission = e.target.value; this.setState({ permission: permission }); }; handleStorageInputChange = (selectedItem) => { this.setState({ storage_id: selectedItem.value }); }; handlelibraryTemplatesInputChange = (selectedItem) => { this.setState({ library_template: selectedItem.value }); }; onEncrypted = (e) => { let isChecked = e.target.checked; this.setState({ encrypt: isChecked, disabled: !isChecked }); }; prepareRepoData = () => { let libraryType = this.props.libraryType; let repoName = this.state.repoName.trim(); let password = this.state.encrypt ? this.state.password1 : ''; let permission = this.state.permission; let repo = null; if (libraryType === 'mine' || libraryType === 'public') { repo = { name: repoName, passwd: password }; } if (libraryType === 'group') { repo = { repo_name: repoName, password: password, permission: permission, }; } if (libraryType === 'department') { repo = { repo_name: repoName, passwd: password, }; } const storage_id = this.state.storage_id; if (storage_id) { repo.storage_id = storage_id; } const library_template = this.state.library_template; if (library_template) { repo.library_template = library_template; } return repo; }; render() { return ( {gettext('New Library')}
{libraryTemplates.length > 0 && ( opt.value === this.state.library_template) || null} /> )} {storages.length > 0 && ( opt.value === this.state.storage_id) || null} /> )} {this.props.libraryType === 'group' && ( )} {enableEncryptedLibrary &&
{!this.state.disabled && {/* todo translate */} {' '}{gettext('(at least {placeholder} characters)').replace('{placeholder}', repoPasswordMinLength)} } {!this.state.disabled && }
}
{this.state.errMessage && {this.state.errMessage}}
); } } CreateRepoDialog.propTypes = propTypes; export default CreateRepoDialog;