diff --git a/frontend/src/components/dirent-list-view/dirent-list-item.js b/frontend/src/components/dirent-list-view/dirent-list-item.js index f83107247f..319534b627 100644 --- a/frontend/src/components/dirent-list-view/dirent-list-item.js +++ b/frontend/src/components/dirent-list-view/dirent-list-item.js @@ -2,6 +2,7 @@ import React, { Fragment } from 'react'; import PropTypes from 'prop-types'; import MD5 from 'MD5'; import { UncontrolledTooltip } from 'reactstrap'; +import { Dropdown, DropdownToggle, DropdownItem } from 'reactstrap'; import { gettext, siteRoot, mediaUrl, username } from '../../utils/constants'; import { Utils } from '../../utils/utils'; import { seafileAPI } from '../../utils/seafile-api'; @@ -70,6 +71,7 @@ class DirentListItem extends React.Component { isDropTipshow: false, isEditFileTagShow: false, isPermissionDialogOpen: false, + isOpMenuOpen: false // for mobile }; } @@ -86,6 +88,12 @@ class DirentListItem extends React.Component { } } + toggleOpMenu = () => { + this.setState({ + isOpMenuOpen: !this.state.isOpMenuOpen + }); + } + //UI Interactive onMouseEnter = () => { if (!this.props.isItemFreezed) { @@ -186,6 +194,11 @@ class DirentListItem extends React.Component { this.setState({isShareDialogShow: !this.state.isShareDialogShow}); } + onMobileMenuItemClick = (e) => { + const operation = e.target.getAttribute('data-op'); + this.onMenuItemClick(operation, e); + } + onMenuItemClick = (operation, event) => { switch(operation) { case 'Download': @@ -586,70 +599,121 @@ class DirentListItem extends React.Component { trClass += (activeDirent && activeDirent.name === dirent.name) ? 'tr-active' : ''; trClass += dirent.isSelected? 'tr-active' : ''; - let lockedInfo = gettext('locked by {name}'); - lockedInfo = lockedInfo.replace('{name}', dirent.lock_owner_name); + let lockedInfo = gettext('locked by {name}').replace('{name}', dirent.lock_owner_name); + + const isDesktop = Utils.isDesktop(); + const desktopItem = ( + + + + + + {dirent.starred !== undefined && !dirent.starred && } + {dirent.starred !== undefined && dirent.starred && } + + +
+ {dirent.encoded_thumbnail_src ? + : + + } + {dirent.is_locked && {gettext('locked')}} +
+
+ + + {this.state.isRenameing ? + : + {dirent.name} + } + + + {(dirent.type !== 'dir' && dirent.file_tags && dirent.file_tags.length > 0) && ( + +
+ {dirent.file_tags.map((fileTag, index) => { + let length = dirent.file_tags.length; + return ( + + ); + })} +
+ + {tagTitle} + +
+ )} + + {this.renderItemOperation()} + {dirent.size && dirent.size} + {dirent.mtime_relative} + + ); + const mobileItem = ( + + +
+ {dirent.encoded_thumbnail_src ? + : + + } + {dirent.is_locked && {gettext('locked')}} +
+ + + {this.state.isRenameing ? + : + {dirent.name} + } +
+ {dirent.size && {dirent.size}} + {dirent.mtime_relative} + + + + +
+
+
+ {dirent.starred !== undefined && + {dirent.starred ? gettext('Unstar') : gettext('Star')}} + {this.props.getDirentItemMenuList(dirent, true).map((item, index) => { + if (item != 'Divider' && item.key != 'Open via Client') { + return ( + {item.value} + ); + } + })} +
+
+
+ + + ); return ( - - - - - - {dirent.starred !== undefined && !dirent.starred && } - {dirent.starred !== undefined && dirent.starred && } - - -
- {dirent.encoded_thumbnail_src ? - : - - } - {dirent.is_locked && {gettext('locked')}} -
-
- - - {this.state.isRenameing ? - : - {dirent.name} - } - - - {(dirent.type !== 'dir' && dirent.file_tags && dirent.file_tags.length > 0) && ( - -
- {dirent.file_tags.map((fileTag, index) => { - let length = dirent.file_tags.length; - return ( - - ); - })} -
- - {tagTitle} - -
- )} - - {this.renderItemOperation()} - {dirent.size && dirent.size} - {dirent.mtime_relative} - + {isDesktop ? desktopItem : mobileItem} {this.state.isMoveDialogShow && : ; + const isDesktop = Utils.isDesktop(); + return (
- +
+ {isDesktop ? ( + ) : ( + + + + + + + + )} {direntList.map((dirent, index) => { return (
@@ -678,6 +681,15 @@ class DirentListView extends React.Component { {gettext('Last Update')} {sortByTime && sortIcon}