diff --git a/frontend/src/components/edit-icon.js b/frontend/src/components/edit-icon.js index c067591568..f9be22c090 100644 --- a/frontend/src/components/edit-icon.js +++ b/frontend/src/components/edit-icon.js @@ -2,20 +2,20 @@ import React from 'react'; import PropTypes from 'prop-types'; import { gettext } from '../utils/constants'; -const EditIcon = (props) => { +function EditIcon({ onClick }) { return ( - - + className="sf3-font sf3-font-rename op-icon op-icon-bg-light ml-1" + onClick={onClick}> + ); -}; +} EditIcon.propTypes = { - onClick: PropTypes.func.isRequired, + onClick: PropTypes.func.isRequired }; export default EditIcon; diff --git a/frontend/src/metadata/views/face-recognition/peoples/people/op-menu/index.js b/frontend/src/metadata/views/face-recognition/peoples/people/op-menu/index.js index 62aa761f4e..7e7fcf9c8c 100644 --- a/frontend/src/metadata/views/face-recognition/peoples/people/op-menu/index.js +++ b/frontend/src/metadata/views/face-recognition/peoples/people/op-menu/index.js @@ -35,7 +35,7 @@ const OpMenu = ({ onRename, onFreezed, onUnFreezed }) => { tag="i" role="button" tabIndex="0" - className="sf-dropdown-toggle sf3-font-more sf3-font face-recognition-more-operations-toggle" + className="sf-dropdown-toggle op-icon sf3-font-more sf3-font face-recognition-more-operations-toggle" title={gettext('More operations')} aria-label={gettext('More operations')} data-toggle="dropdown" diff --git a/frontend/src/pages/org-admin/departments/member-item.js b/frontend/src/pages/org-admin/departments/member-item.js index 75ba11cbcd..58190a846c 100644 --- a/frontend/src/pages/org-admin/departments/member-item.js +++ b/frontend/src/pages/org-admin/departments/member-item.js @@ -111,7 +111,7 @@ class DepartmentsV2MembersItem extends React.Component { direction="down" > { - this.setState({ isOpIconShown: true }); + this.setState({ + isHighlighted: true, + isOpIconShown: true + }); }; handleMouseOut = () => { - this.setState({ isOpIconShown: false }); + this.setState({ + isHighlighted: false, + isOpIconShown: false + }); }; - handleUnlink = (e) => { - e.preventDefault(); + handleUnlink = () => { if (this.props.item.is_desktop_client) { this.toggleUnlinkDeviceDialog(); } else { @@ -129,7 +136,7 @@ class Item extends Component { render() { const item = this.props.item; - const { unlinked, isUnlinkDeviceDialogOpen, isOpIconShown } = this.state; + const { unlinked, isUnlinkDeviceDialogOpen, isOpIconShown, isHighlighted } = this.state; if (unlinked) { return null; @@ -137,7 +144,13 @@ class Item extends Component { return ( - + {item.user_name} {item.platform}{' / '}{item.client_version} {item.device_name} @@ -146,7 +159,12 @@ class Item extends Component { {dayjs(item.last_accessed).fromNow()} - + + {isUnlinkDeviceDialogOpen && diff --git a/frontend/src/pages/org-admin/libraries/org-all-repos.js b/frontend/src/pages/org-admin/libraries/org-all-repos.js index 13f223310a..d3bba4a36b 100644 --- a/frontend/src/pages/org-admin/libraries/org-all-repos.js +++ b/frontend/src/pages/org-admin/libraries/org-all-repos.js @@ -173,7 +173,6 @@ class RepoItem extends React.Component { }; onDropdownToggleClick = (e) => { - e.preventDefault(); this.toggleOperationMenu(e); }; @@ -243,7 +242,8 @@ class RepoItem extends React.Component { {isOperationMenuShow && {items.map((item, index) => { - return (); + return ( + + ); })} @@ -117,7 +120,7 @@ class Item extends Component { constructor(props) { super(props); this.state = { - highlight: false, + isHighlighted: false, isOpIconShown: false, isDeleteRepoDialogOpen: false, isRestoreRepoDialogOpen: false @@ -128,7 +131,7 @@ class Item extends Component { if (!this.props.isItemFreezed) { this.setState({ isOpIconShown: true, - highlight: true + isHighlighted: true }); } }; @@ -137,14 +140,14 @@ class Item extends Component { if (!this.props.isItemFreezed) { this.setState({ isOpIconShown: false, - highlight: false + isHighlighted: false }); } }; onUnfreezedItem = () => { this.setState({ - highlight: false, + isHighlighted: false, isOpIconShow: false }); this.props.onUnfreezedItem(); @@ -219,14 +222,20 @@ class Item extends Component { render() { const { repo } = this.props; - const { isOpIconShown, isDeleteRepoDialogOpen, isRestoreRepoDialogOpen } = this.state; + const { isHighlighted, isOpIconShown, isDeleteRepoDialogOpen, isRestoreRepoDialogOpen } = this.state; const iconUrl = Utils.getLibIconUrl(repo); const iconTitle = Utils.getLibIconTitle(repo); const repoName = '' + Utils.HTMLescape(repo.name) + ''; return ( - + {iconTitle} {repo.name} diff --git a/frontend/src/pages/org-admin/org-group-repos.js b/frontend/src/pages/org-admin/org-group-repos.js index 5ffe7e6e62..4d62b84109 100644 --- a/frontend/src/pages/org-admin/org-group-repos.js +++ b/frontend/src/pages/org-admin/org-group-repos.js @@ -1,5 +1,6 @@ import React, { Component, Fragment } from 'react'; import PropTypes from 'prop-types'; +import classnames from 'classnames'; import { Link } from '@gatsbyjs/reach-router'; import { orgAdminAPI } from '../../utils/org-admin-api'; import { gettext, siteRoot } from '../../utils/constants'; @@ -76,7 +77,7 @@ class Content extends Component { return ( - +
@@ -106,6 +107,7 @@ class Item extends Component { constructor(props) { super(props); this.state = { + isHighlighted: false, isOpIconShown: false, deleted: false, isDeleteRepoDialogOpen: false, @@ -115,18 +117,19 @@ class Item extends Component { handleMouseOver = () => { this.setState({ + isHighlighted: true, isOpIconShown: true }); }; handleMouseOut = () => { this.setState({ + isHighlighted: false, isOpIconShown: false }); }; - handleDeleteIconClick = (e) => { - e.preventDefault(); + handleDeleteIconClick = () => { this.toggleDeleteRepoDialog(); }; @@ -154,7 +157,7 @@ class Item extends Component { }; render() { - const { deleted, isOpIconShown, isDeleteRepoDialogOpen } = this.state; + const { deleted, isOpIconShown, isDeleteRepoDialogOpen, isHighlighted } = this.state; const repo = this.props.data; if (deleted) { @@ -163,7 +166,13 @@ class Item extends Component { return ( - + @@ -171,7 +180,12 @@ class Item extends Component { {isDeleteRepoDialogOpen && ( diff --git a/frontend/src/pages/org-admin/org-groups-search-groups.js b/frontend/src/pages/org-admin/org-groups-search-groups.js index 5f5c7d7231..b476d558cb 100644 --- a/frontend/src/pages/org-admin/org-groups-search-groups.js +++ b/frontend/src/pages/org-admin/org-groups-search-groups.js @@ -37,7 +37,6 @@ class GroupItem extends React.Component { }; onDropdownToggleClick = (e) => { - e.preventDefault(); this.toggleOperationMenu(e); }; @@ -102,7 +101,7 @@ class GroupItem extends React.Component { {isOperationMenuShow && {gettext('Name')} - + diff --git a/frontend/src/pages/org-admin/org-groups.js b/frontend/src/pages/org-admin/org-groups.js index d064d4c32a..caa296a27f 100644 --- a/frontend/src/pages/org-admin/org-groups.js +++ b/frontend/src/pages/org-admin/org-groups.js @@ -179,7 +179,7 @@ class OrgGroups extends Component { - + @@ -251,7 +251,6 @@ class GroupItem extends React.Component { }; onDropdownToggleClick = (e) => { - e.preventDefault(); this.toggleOperationMenu(e); }; @@ -319,7 +318,7 @@ class GroupItem extends React.Component { {isOperationMenuShow && { - e.preventDefault(); this.toggleOperationMenu(e); }; @@ -207,7 +206,7 @@ class RepoItem extends React.Component { {this.state.showMenu && {fileEvent.user_name}{' '} - + {gettext('Only Show')}{' '} @@ -225,7 +225,7 @@ class FileAuditItem extends React.Component { { fileEvent.repo_name && - + {gettext('Only Show')}{' '}{fileEvent.repo_name} diff --git a/frontend/src/pages/org-admin/org-logs-file-update.js b/frontend/src/pages/org-admin/org-logs-file-update.js index 6417c791f1..8bec78e3f5 100644 --- a/frontend/src/pages/org-admin/org-logs-file-update.js +++ b/frontend/src/pages/org-admin/org-logs-file-update.js @@ -210,7 +210,7 @@ class FileUpdateItem extends React.Component { {fileEvent.user_name}{' '} - + {gettext('Only Show')}{' '}{fileEvent.user_name} @@ -236,7 +236,7 @@ class FileUpdateItem extends React.Component { { fileEvent.repo_name && - + {gettext('Only Show')}{' '} diff --git a/frontend/src/pages/org-admin/org-logs-perm-audit.js b/frontend/src/pages/org-admin/org-logs-perm-audit.js index 9a7c4682a9..899206488f 100644 --- a/frontend/src/pages/org-admin/org-logs-perm-audit.js +++ b/frontend/src/pages/org-admin/org-logs-perm-audit.js @@ -157,7 +157,7 @@ class PermAuditItem extends React.Component { {permEvent.from_user_name}{' '} - + {gettext('Only Show')}{' '} diff --git a/frontend/src/pages/org-admin/org-user-item.js b/frontend/src/pages/org-admin/org-user-item.js index f0452c3409..64bbb38f86 100644 --- a/frontend/src/pages/org-admin/org-user-item.js +++ b/frontend/src/pages/org-admin/org-user-item.js @@ -85,7 +85,6 @@ class UserItem extends React.Component { }; onDropdownToggleClick = (e) => { - e.preventDefault(); this.toggleOperationMenu(e); }; @@ -176,7 +175,7 @@ class UserItem extends React.Component { {isOperationMenuShow && ( {gettext('Name')}
{name || '--'} - +
{gettext('Contact Email')}
{contact_email || '--'} - +
{gettext('Organization')}
@@ -151,7 +152,7 @@ class Content extends Component {
{gettext('Space Used / Quota')}
{`${Utils.bytesToSize(quota_usage)}${quota_total > 0 ? ' / ' + Utils.bytesToSize(quota_total) : ''}`} - +
{isSetNameDialogOpen && diff --git a/frontend/src/pages/org-admin/org-user-repos.js b/frontend/src/pages/org-admin/org-user-repos.js index 81e5b207b4..88f38db736 100644 --- a/frontend/src/pages/org-admin/org-user-repos.js +++ b/frontend/src/pages/org-admin/org-user-repos.js @@ -1,6 +1,7 @@ import React, { Component, Fragment } from 'react'; import PropTypes from 'prop-types'; import dayjs from 'dayjs'; +import classnames from 'classnames'; import { orgAdminAPI } from '../../utils/org-admin-api'; import { gettext } from '../../utils/constants'; import { Utils } from '../../utils/utils'; @@ -102,6 +103,7 @@ class Item extends Component { constructor(props) { super(props); this.state = { + isHighlighted: false, isOpIconShown: false, deleted: false, isDeleteRepoDialogOpen: false, @@ -111,18 +113,19 @@ class Item extends Component { handleMouseOver = () => { this.setState({ + isHighlighted: true, isOpIconShown: true }); }; handleMouseOut = () => { this.setState({ + isHighlighted: false, isOpIconShown: false }); }; - handleDeleteIconClick = (e) => { - e.preventDefault(); + handleDeleteIconClick = () => { this.toggleDeleteRepoDialog(); }; @@ -150,7 +153,7 @@ class Item extends Component { }; render() { - const { deleted, isOpIconShown, isDeleteRepoDialogOpen } = this.state; + const { deleted, isOpIconShown, isDeleteRepoDialogOpen, isHighlighted } = this.state; const repo = this.props.data; if (deleted) { @@ -159,7 +162,13 @@ class Item extends Component { return ( -
+ @@ -167,7 +176,13 @@ class Item extends Component { {isDeleteRepoDialogOpen && ( diff --git a/frontend/src/pages/sys-admin/groups/group-members.js b/frontend/src/pages/sys-admin/groups/group-members.js index 936dae22ed..4829c2eca9 100644 --- a/frontend/src/pages/sys-admin/groups/group-members.js +++ b/frontend/src/pages/sys-admin/groups/group-members.js @@ -60,14 +60,16 @@ class Content extends Component { {items.map((item, index) => { - return (); + return ( + + ); })}
{/* icon*/}
{Utils.getLibIconTitle(repo)} {Utils.bytesToSize(repo.size)} {repo.shared_by_name} - + +
{gettext('Creator')} {gettext('Created At')}{gettext('Operations')}
{gettext('Name')} {gettext('Creator')} {gettext('Created At')}{gettext('Operations')}
{Utils.getLibIconTitle(repo)} {Utils.bytesToSize(repo.size)} {dayjs(repo.last_modified).format('YYYY-MM-DD')} - + +
@@ -174,7 +176,13 @@ class Item extends Component { {item.role != 'Owner' && - + + } diff --git a/frontend/src/pages/sys-admin/groups/group-repos.js b/frontend/src/pages/sys-admin/groups/group-repos.js index 8bdcccccfd..15bd20b164 100644 --- a/frontend/src/pages/sys-admin/groups/group-repos.js +++ b/frontend/src/pages/sys-admin/groups/group-repos.js @@ -1,5 +1,6 @@ import React, { Component, Fragment } from 'react'; import PropTypes from 'prop-types'; +import classnames from 'classnames'; import { Utils } from '../../../utils/utils'; import { systemAdminAPI } from '../../../utils/system-admin-api'; import { siteRoot, gettext, isPro } from '../../../utils/constants'; @@ -32,7 +33,7 @@ class Content extends Component { ); const table = ( - +
@@ -44,11 +45,13 @@ class Content extends Component { {items.map((item, index) => { - return (); + return ( + + ); })}
{/* icon */}
@@ -75,23 +78,27 @@ class Item extends Component { constructor(props) { super(props); this.state = { + isHighlighted: false, isOpIconShown: false, isUnshareRepoDialogOpen: false }; } handleMouseEnter = () => { - this.setState({ isOpIconShown: true }); + this.setState({ + isHighlighted: true, + isOpIconShown: true + }); }; handleMouseLeave = () => { - this.setState({ isOpIconShown: false }); + this.setState({ + isHighlighted: false, + isOpIconShown: false + }); }; - toggleUnshareRepoDialog = (e) => { - if (e) { - e.preventDefault(); - } + toggleUnshareRepoDialog = () => { this.setState({ isUnshareRepoDialogOpen: !this.state.isUnshareRepoDialogOpen }); }; @@ -117,7 +124,7 @@ class Item extends Component { }; render() { - let { isOpIconShown, isUnshareRepoDialogOpen } = this.state; + let { isOpIconShown, isUnshareRepoDialogOpen, isHighlighted } = this.state; let { item } = this.props; let iconUrl = Utils.getLibIconUrl(item); @@ -128,7 +135,13 @@ class Item extends Component { return ( - + {iconTitle} {this.renderRepoName()} {Utils.bytesToSize(item.size)} @@ -136,7 +149,13 @@ class Item extends Component { - + + {isUnshareRepoDialogOpen && diff --git a/frontend/src/pages/sys-admin/orgs/org-groups.js b/frontend/src/pages/sys-admin/orgs/org-groups.js index e5c36911d7..0cf5dc1818 100644 --- a/frontend/src/pages/sys-admin/orgs/org-groups.js +++ b/frontend/src/pages/sys-admin/orgs/org-groups.js @@ -1,6 +1,7 @@ import React, { Component, Fragment } from 'react'; import PropTypes from 'prop-types'; import dayjs from 'dayjs'; +import classnames from 'classnames'; import { Utils } from '../../../utils/utils'; import { systemAdminAPI } from '../../../utils/system-admin-api'; import { siteRoot, gettext } from '../../../utils/constants'; @@ -42,11 +43,13 @@ class Content extends Component { {items.map((item, index) => { - return (); + return ( + + ); })} @@ -73,23 +76,27 @@ class Item extends Component { constructor(props) { super(props); this.state = { + isHighlighted: false, isOpIconShown: false, isDeleteDialogOpen: false }; } handleMouseEnter = () => { - this.setState({ isOpIconShown: true }); + this.setState({ + isHighlighted: true, + isOpIconShown: true + }); }; handleMouseLeave = () => { - this.setState({ isOpIconShown: false }); + this.setState({ + isHighlighted: false, + isOpIconShown: false + }); }; - toggleDeleteDialog = (e) => { - if (e) { - e.preventDefault(); - } + toggleDeleteDialog = () => { this.setState({ isDeleteDialogOpen: !this.state.isDeleteDialogOpen }); }; @@ -100,7 +107,7 @@ class Item extends Component { render() { const { item } = this.props; - const { isOpIconShown, isDeleteDialogOpen } = this.state; + const { isOpIconShown, isDeleteDialogOpen, isHighlighted } = this.state; const itemName = '' + Utils.HTMLescape(item.group_name) + ''; const deleteDialogMsg = gettext('Are you sure you want to delete {placeholder} ?').replace('{placeholder}', itemName); @@ -109,12 +116,23 @@ class Item extends Component { return ( - + {item.group_name} {dayjs(item.created_at).format('YYYY-MM-DD HH:mm:ss')} - + + {isDeleteDialogOpen && diff --git a/frontend/src/pages/sys-admin/orgs/org-repos.js b/frontend/src/pages/sys-admin/orgs/org-repos.js index 861310cc2f..cecb54a87c 100644 --- a/frontend/src/pages/sys-admin/orgs/org-repos.js +++ b/frontend/src/pages/sys-admin/orgs/org-repos.js @@ -1,5 +1,6 @@ import React, { Component, Fragment } from 'react'; import PropTypes from 'prop-types'; +import classnames from 'classnames'; import { Utils } from '../../../utils/utils'; import { systemAdminAPI } from '../../../utils/system-admin-api'; import { gettext } from '../../../utils/constants'; @@ -25,7 +26,7 @@ class Content extends Component { ); const table = ( - +
@@ -37,11 +38,13 @@ class Content extends Component { {items.map((item, index) => { - return (); + return ( + + ); })}
@@ -64,17 +67,24 @@ class Item extends Component { constructor(props) { super(props); this.state = { + isHighlighted: false, isOpIconShown: false, isDeleteDialogOpen: false }; } handleMouseEnter = () => { - this.setState({ isOpIconShown: true }); + this.setState({ + isHighlighted: true, + isOpIconShown: true + }); }; handleMouseLeave = () => { - this.setState({ isOpIconShown: false }); + this.setState({ + isHighlighted: false, + isOpIconShown: false + }); }; toggleDeleteDialog = (e) => { @@ -90,7 +100,7 @@ class Item extends Component { render() { const { item } = this.props; - const { isOpIconShown, isDeleteDialogOpen } = this.state; + const { isOpIconShown, isDeleteDialogOpen, isHighlighted } = this.state; const iconUrl = Utils.getLibIconUrl(item); const iconTitle = Utils.getLibIconTitle(item); @@ -100,7 +110,13 @@ class Item extends Component { return ( - + {iconTitle} {item.repo_name} {item.repo_id} @@ -113,7 +129,12 @@ class Item extends Component { } - + + {isDeleteDialogOpen && diff --git a/frontend/src/pages/sys-admin/repos/dir-content.js b/frontend/src/pages/sys-admin/repos/dir-content.js index 0c7f6c6f94..a4391e2492 100644 --- a/frontend/src/pages/sys-admin/repos/dir-content.js +++ b/frontend/src/pages/sys-admin/repos/dir-content.js @@ -3,6 +3,7 @@ import PropTypes from 'prop-types'; import { Link } from '@gatsbyjs/reach-router'; import dayjs from 'dayjs'; import relativeTime from 'dayjs/plugin/relativeTime'; +import classnames from 'classnames'; import { gettext } from '../../../utils/constants'; import { Utils } from '../../../utils/utils'; import Loading from '../../../components/loading'; @@ -14,18 +15,21 @@ class DirentItem extends React.Component { constructor(props) { super(props); this.state = { + isHighlighted: false, isOpIconShown: false }; } handleMouseOver = () => { this.setState({ + isHighlighted: true, isOpIconShown: true }); }; handleMouseOut = () => { this.setState({ + isHighlighted: false, isOpIconShown: false }); }; @@ -34,24 +38,28 @@ class DirentItem extends React.Component { this.props.openFolder(this.props.dirent); }; - deleteDirent = (e) => { - e.preventDefault(); + deleteDirent = () => { this.props.deleteDirent(this.props.dirent); }; - downloadDirent = (e) => { - e.preventDefault(); + downloadDirent = () => { this.props.downloadDirent(this.props.dirent); }; render() { - let { isOpIconShown } = this.state; + let { isOpIconShown, isHighlighted } = this.state; let { dirent, fromSystemRepo } = this.props; let iconUrl = Utils.getDirentIcon(dirent); return ( - + {dirent.is_file ? @@ -61,10 +69,20 @@ class DirentItem extends React.Component { {isOpIconShown && fromSystemRepo && - + + } {isOpIconShown && dirent.is_file && - + + } {dirent.size} diff --git a/frontend/src/pages/sys-admin/users/user-shared-repos.js b/frontend/src/pages/sys-admin/users/user-shared-repos.js index dca877305f..9f312aa8ce 100644 --- a/frontend/src/pages/sys-admin/users/user-shared-repos.js +++ b/frontend/src/pages/sys-admin/users/user-shared-repos.js @@ -3,6 +3,7 @@ import PropTypes from 'prop-types'; import { Link } from '@gatsbyjs/reach-router'; import dayjs from 'dayjs'; import relativeTime from 'dayjs/plugin/relativeTime'; +import classnames from 'classnames'; import { Utils } from '../../../utils/utils'; import { systemAdminAPI } from '../../../utils/system-admin-api'; import { isPro, siteRoot, gettext } from '../../../utils/constants'; @@ -24,7 +25,7 @@ class Content extends Component { return

{errorMsg}

; } else { const table = ( - +
@@ -57,6 +58,25 @@ Content.propTypes = { class Item extends Component { + constructor(props) { + super(props); + this.state = { + isHighlighted: false + }; + } + + handleMouseOver = () => { + this.setState({ + isHighlighted: true + }); + }; + + handleMouseOut = () => { + this.setState({ + isHighlighted: false + }); + }; + renderRepoName = () => { const { item } = this.props; const repo = item; @@ -89,8 +109,15 @@ class Item extends Component { const { item } = this.props; const iconUrl = Utils.getLibIconUrl(item); const iconTitle = Utils.getLibIconTitle(item); + const { isHighlighted } = this.state; return ( - + diff --git a/media/css/seahub_react.css b/media/css/seahub_react.css index d13d51f89e..30b0373241 100644 --- a/media/css/seahub_react.css +++ b/media/css/seahub_react.css @@ -567,7 +567,7 @@ a, a:hover { .op-icon { font-size: 1rem; line-height: 1; - color: #999; + color: #666; cursor: pointer; display: inline-flex; width: 24px; @@ -580,7 +580,7 @@ a, a:hover { .op-icon:focus, .op-icon:hover { - color: #666; + color: #666; /* to overwrite the styles for `a:hover` */ text-decoration: none; background: #e5e5e5; } @@ -590,10 +590,6 @@ a, a:hover { background: #efefef; /* for .op-icon shown in white containers */ } -.tr-highlight .op-icon { - color: #666; -} - .action-icon, .attr-action-icon { margin-left: 0.5rem;
{iconTitle} {this.renderRepoName()} {this.getOwnerLink()}