import React, { Fragment } from 'react';
import PropTypes from 'prop-types';
import { Dropdown, DropdownToggle, DropdownMenu, DropdownItem } from 'reactstrap';
import { Utils } from '../../utils/utils';
import { enableSeadoc, gettext } from '../../utils/constants';
import ModalPortal from '../modal-portal';
import CreateFolder from '../../components/dialog/create-folder-dialog';
import CreateFile from '../../components/dialog/create-file-dialog';
import ShareDialog from '../../components/dialog/share-dialog';
const propTypes = {
path: PropTypes.string.isRequired,
repoID: PropTypes.string.isRequired,
repoName: PropTypes.string.isRequired,
repoEncrypted: PropTypes.bool.isRequired,
enableDirPrivateShare: PropTypes.bool.isRequired,
userPerm: PropTypes.string.isRequired,
isGroupOwnedRepo: PropTypes.bool.isRequired,
showShareBtn: PropTypes.bool.isRequired,
onAddFile: PropTypes.func.isRequired,
onAddFolder: PropTypes.func.isRequired,
onUploadFile: PropTypes.func.isRequired,
onUploadFolder: PropTypes.func.isRequired,
direntList: PropTypes.array.isRequired,
children: PropTypes.object
};
class DirOperationToolbar extends React.Component {
constructor(props) {
super(props);
this.state = {
fileType: '.md',
isCreateFileDialogShow: false,
isCreateFolderDialogShow: false,
isShareDialogShow: false,
operationMenuStyle: '',
isDesktopMenuOpen: false,
isMobileOpMenuOpen: false
};
}
toggleDesktopOpMenu = () => {
this.setState({isDesktopMenuOpen: !this.state.isDesktopMenuOpen});
};
toggleMobileOpMenu = () => {
this.setState({isMobileOpMenuOpen: !this.state.isMobileOpMenuOpen});
};
onUploadFile = (e) => {
this.props.onUploadFile(e);
};
onUploadFolder = (e) => {
this.props.onUploadFolder(e);
};
onShareClick = () => {
this.setState({
isShareDialogShow: !this.state.isShareDialogShow
});
};
onCreateFolderToggle = () => {
this.setState({isCreateFolderDialogShow: !this.state.isCreateFolderDialogShow});
};
onCreateFileToggle = () => {
this.setState({
isCreateFileDialogShow: !this.state.isCreateFileDialogShow,
fileType: ''
});
};
onCreateMarkdownToggle = () => {
this.setState({
isCreateFileDialogShow: !this.state.isCreateFileDialogShow,
fileType: '.md'
});
};
onCreateExcelToggle = () => {
this.setState({
isCreateFileDialogShow: !this.state.isCreateFileDialogShow,
fileType: '.xlsx'
});
};
onCreatePPTToggle = () => {
this.setState({
isCreateFileDialogShow: !this.state.isCreateFileDialogShow,
fileType: '.pptx'
});
};
onCreateWordToggle = () => {
this.setState({
isCreateFileDialogShow: !this.state.isCreateFileDialogShow,
fileType: '.docx'
});
};
onCreateSeaDocToggle = () => {
this.setState({
isCreateFileDialogShow: !this.state.isCreateFileDialogShow,
fileType: '.sdoc'
});
};
onAddFolder = (dirPath) => {
this.setState({isCreateFolderDialogShow: false});
this.props.onAddFolder(dirPath);
};
checkDuplicatedName = (newName) => {
let direntList = this.props.direntList;
let isDuplicated = direntList.some(object => {
return object.name === newName;
});
return isDuplicated;
};
onDropdownToggleKeyDown = (e) => {
if (e.key == 'Enter' || e.key == 'Space') {
this.toggleDesktopOpMenu();
}
};
onDropDownMouseMove = (e) => {
if (this.state.isSubMenuShown && e.target && e.target.className === 'dropdown-item') {
this.setState({
isSubMenuShown: false
});
}
};
toggleSubMenu = (e) => {
e.stopPropagation();
this.setState({
isSubMenuShown: !this.state.isSubMenuShown}, () => {
this.toggleDesktopOpMenu();
});
};
toggleSubMenuShown = (item) => {
this.setState({
isSubMenuShown: true,
currentItem: item.text
});
};
onMenuItemKeyDown = (item, e) => {
if (e.key == 'Enter' || e.key == 'Space') {
item.onClick();
}
};
render() {
let { path, repoName, userPerm } = this.props;
let itemType = path === '/' ? 'library' : 'dir';
let itemName = path == '/' ? repoName : Utils.getFolderName(path);
const { isCustomPermission, customPermission } = Utils.getUserPermission(userPerm);
let canUpload = true;
let canCreate = true;
if (isCustomPermission) {
const { permission } = customPermission;
canUpload = permission.upload;
canCreate = permission.create;
}
let content = null;
if (Utils.isDesktop()) {
const { showShareBtn, repoEncrypted } = this.props;
let opList = [];
if (canUpload) {
if (Utils.isSupportUploadFolder()) {
opList.push({
'icon': 'upload-files',
'text': gettext('Upload'),
subOpList: [
{'text': gettext('Upload Files'), 'onClick': this.onUploadFile},
{'text': gettext('Upload Folder'), 'onClick': this.onUploadFolder}
]
});
} else {
opList.push({'text': gettext('Upload'), 'onClick': this.onUploadFile});
}
}
if (canCreate) {
let newSubOpList = [
{'text': gettext('New Folder'), 'onClick': this.onCreateFolderToggle},
{'text': gettext('New File'), 'onClick': this.onCreateFileToggle},
'Divider',
{'text': gettext('New Markdown File'), 'onClick': this.onCreateMarkdownToggle},
{'text': gettext('New Excel File'), 'onClick': this.onCreateExcelToggle},
{'text': gettext('New PowerPoint File'), 'onClick': this.onCreatePPTToggle},
{'text': gettext('New Word File'), 'onClick': this.onCreateWordToggle}
];
if (enableSeadoc && !repoEncrypted) {
newSubOpList.push({'text': gettext('New SeaDoc File'), 'onClick': this.onCreateSeaDocToggle});
}
opList.push({
'icon': 'new',
'text': gettext('New'),
subOpList: newSubOpList
});
}
if (showShareBtn) {
opList.push({
'icon': 'share',
'text': gettext('Share'),
'onClick': this.onShareClick
});
}
content = (
{this.props.children}
{opList.map((item, index)=> {
if (item == 'Divider') {
return ;
} else if (item.subOpList) {
return (
{e.stopPropagation();}}
>
{item.text}
{item.subOpList.map((item, index)=> {
if (item == 'Divider') {
return ;
} else {
return ({item.text});
}
})}
);
} else {
return (
{item.text}
);
}
})}
);
} else {
content = (
{canUpload && (
{gettext('Upload')}
)}
{canCreate && (
{gettext('New Folder')}
{gettext('New File')}
)}
);
}
return (
{(userPerm === 'rw' || userPerm === 'admin' || userPerm === 'cloud-edit' || isCustomPermission) && (
{content}
)}
{this.state.isCreateFileDialogShow && (
)}
{this.state.isCreateFolderDialogShow && (
)}
{this.state.isShareDialogShow &&
}
);
}
}
DirOperationToolbar.propTypes = propTypes;
export default DirOperationToolbar;