diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 06172323a9..95bd6b231a 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -9964,7 +9964,7 @@ }, "react-popper": { "version": "0.8.3", - "resolved": "http://registry.npmjs.org/react-popper/-/react-popper-0.8.3.tgz", + "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-0.8.3.tgz", "integrity": "sha1-D3MzMTfJ+wr27EB00tBYWgoEYeE=", "requires": { "popper.js": "^1.12.9", diff --git a/frontend/src/components/dialog/share-to-group.js b/frontend/src/components/dialog/share-to-group.js index 8e11dc5d7b..f672f73dc3 100644 --- a/frontend/src/components/dialog/share-to-group.js +++ b/frontend/src/components/dialog/share-to-group.js @@ -7,6 +7,63 @@ import { gettext } from '../../utils/constants'; import { Utils } from '../../utils/utils'; import { seafileAPI } from '../../utils/seafile-api.js'; +class GroupItem extends React.Component { + + constructor(props) { + super(props); + this.state = { + isOperationShow: false + }; + } + + onMouseEnter = () => { + this.setState({isOperationShow: true}); + } + + onMouseLeave = () => { + this.setState({isOperationShow: false}); + } + + deleteShareItem = () => { + let item = this.props.item; + this.props.deleteShareItem(item.group_info.id); + } + + render() { + let item = this.props.item; + return ( + + {item.group_info.name} + {Utils.sharePerms[item.permission]} + + + + + + ); + } +} + +class GroupList extends React.Component { + + render() { + let items = this.props.items; + return ( + + {items.map((item, index) => { + return ( + + ); + })} + + ); + } +} + const propTypes = { isGroupOwnedRepo: PropTypes.bool, itemPath: PropTypes.string.isRequired, @@ -85,7 +142,7 @@ class ShareToGroup extends React.Component { let path = this.props.itemPath; let repoID = this.props.repoID; let isGroupOwnedRepo = this.props.isGroupOwnedRepo; - if (this.state.selectedOption.length > 0 ) { + if (this.state.selectedOption && this.state.selectedOption.length > 0 ) { for (let i = 0; i < this.state.selectedOption.length; i ++) { groups[i] = this.state.selectedOption[i].id; } @@ -137,8 +194,7 @@ class ShareToGroup extends React.Component { } } - deleteShareItem = (e, groupID) => { - e.preventDefault(); + deleteShareItem = (groupID) => { let path = this.props.itemPath; let repoID = this.props.repoID; if (this.props.isGroupOwnedRepo) { @@ -207,20 +263,6 @@ class ShareToGroup extends React.Component { } } -function GroupList(props) { - return ( - - {props.items.map((item, index) => ( - - {item.group_info.name} - {Utils.sharePerms[item.permission]} - {props.deleteShareItem(e, item.group_info.id);}} className="sf2-icon-x3 sf2-x op-icon" title={gettext('Delete')}> - - ))} - - ); -} - ShareToGroup.propTypes = propTypes; export default ShareToGroup; diff --git a/frontend/src/components/dialog/share-to-user.js b/frontend/src/components/dialog/share-to-user.js index f587a87c96..01c5a1704b 100644 --- a/frontend/src/components/dialog/share-to-user.js +++ b/frontend/src/components/dialog/share-to-user.js @@ -6,6 +6,63 @@ import PropTypes from 'prop-types'; import { Button, Input } from 'reactstrap'; import { seafileAPI } from '../../utils/seafile-api.js'; +class UserItem extends React.Component { + + constructor(props) { + super(props); + this.state = { + isOperationShow: false + }; + } + + onMouseEnter = () => { + this.setState({isOperationShow: true}); + } + + onMouseLeave = () => { + this.setState({isOperationShow: false}); + } + + deleteShareItem = () => { + let item = this.props.item; + this.props.deleteShareItem(item.name); + } + + render() { + let item = this.props.item; + return ( + + {item.user_info.nickname} + {Utils.sharePerms[item.permission]} + + + + + + ); + } +} + +class UserList extends React.Component { + + render() { + let items = this.props.items; + return ( + + {items.map((item, index) => { + return ( + + ); + })} + + ); + } +} + const propTypes = { isGroupOwnedRepo: PropTypes.bool, itemPath: PropTypes.string.isRequired, @@ -88,7 +145,7 @@ class ShareToUser extends React.Component { let users = []; let path = this.props.itemPath; let repoID = this.props.repoID; - if (this.state.selectedOption.length > 0 ) { + if (this.state.selectedOption && this.state.selectedOption.length > 0 ) { for (let i = 0; i < this.state.selectedOption.length; i ++) { users[i] = this.state.selectedOption[i].email; } @@ -134,8 +191,7 @@ class ShareToUser extends React.Component { } } - deleteShareItem = (e, username) => { - e.preventDefault(); + deleteShareItem = (username) => { let path = this.props.itemPath; let repoID = this.props.repoID; if (this.props.isGroupOwnedRepo) { @@ -210,20 +266,6 @@ class ShareToUser extends React.Component { } } -function UserList(props) { - return ( - - {props.items.map((item, index) => ( - - {item.user_info.nickname} - {Utils.sharePerms[item.permission]} - {props.deleteShareItem(e, item.user_info.name);}} className="sf2-icon-x3 sf2-x op-icon" title={gettext('Delete')}> - - ))} - - ); -} - ShareToUser.propTypes = propTypes; export default ShareToUser; diff --git a/frontend/src/components/dir-view/dir-panel.js b/frontend/src/components/dir-view/dir-panel.js index 4d71ef7437..0910d86cec 100644 --- a/frontend/src/components/dir-view/dir-panel.js +++ b/frontend/src/components/dir-view/dir-panel.js @@ -126,6 +126,7 @@ class DirPanel extends React.Component { onItemsDelete={this.props.onItemsDelete} /> :
- + )}
diff --git a/frontend/src/components/file-chooser/repo-list-item.js b/frontend/src/components/file-chooser/repo-list-item.js index 34e70527b0..a48732b50a 100644 --- a/frontend/src/components/file-chooser/repo-list-item.js +++ b/frontend/src/components/file-chooser/repo-list-item.js @@ -46,14 +46,14 @@ class RepoListItem extends React.Component { {this.props.repo.repo_name} - { + {this.state.isShowChildren && ( - } + )} ); } diff --git a/frontend/src/components/toolbar/dir-operation-toolbar.js b/frontend/src/components/toolbar/dir-operation-toolbar.js index 29d6033e3a..963f43faac 100644 --- a/frontend/src/components/toolbar/dir-operation-toolbar.js +++ b/frontend/src/components/toolbar/dir-operation-toolbar.js @@ -135,14 +135,9 @@ class DirOperationToolbar extends React.Component { } render() { - let isFile = this.props.isViewFile; - let itemName; - if (this.props.isViewFile) { - itemName = Utils.getFileName(this.props.path) - } else { - itemName = this.props.path.replace('\/',''); - } - + let { path, isViewFile } = this.props; + let itemType = isViewFile ? 'file' : 'dir'; + let itemName = isViewFile ? Utils.getFileName(path) : Utils.getFolderName(path); return (
@@ -203,7 +198,7 @@ class DirOperationToolbar extends React.Component { {this.state.isShareDialogShow &&