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 &&