1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-09-11 11:51:27 +00:00

[system admin] update user links (#4234)

This commit is contained in:
llj
2019-11-07 14:17:59 +08:00
committed by Daniel Pan
parent b60d0e6170
commit fd8e5c44e8
26 changed files with 95 additions and 49 deletions

View File

@@ -8,6 +8,7 @@ import Loading from '../../../components/loading';
import Paginator from '../../../components/paginator'; import Paginator from '../../../components/paginator';
import LogsNav from './logs-nav'; import LogsNav from './logs-nav';
import MainPanelTopbar from '../main-panel-topbar'; import MainPanelTopbar from '../main-panel-topbar';
import UserLink from '../user-link';
class Content extends Component { class Content extends Component {
@@ -84,7 +85,7 @@ class Item extends Component {
let { item } = this.props; let { item } = this.props;
return ( return (
<tr onMouseOver={this.handleMouseOver} onMouseOut={this.handleMouseOut}> <tr onMouseOver={this.handleMouseOver} onMouseOut={this.handleMouseOut}>
<td><a href={siteRoot + 'useradmin/info/' + item.email + '/'}>{item.name}</a></td> <td><UserLink email={item.email} name={item.name} /></td>
<td>{item.login_ip}</td> <td>{item.login_ip}</td>
<td>{item.login_success ? gettext('Success') : gettext('Failed')}</td> <td>{item.login_success ? gettext('Success') : gettext('Failed')}</td>
<td>{moment(item.login_time).fromNow()}</td> <td>{moment(item.login_time).fromNow()}</td>

View File

@@ -8,7 +8,7 @@ import Loading from '../../../components/loading';
import Paginator from '../../../components/paginator'; import Paginator from '../../../components/paginator';
import LogsNav from './logs-nav'; import LogsNav from './logs-nav';
import MainPanelTopbar from '../main-panel-topbar'; import MainPanelTopbar from '../main-panel-topbar';
import UserLink from '../user-link';
class Content extends Component { class Content extends Component {
@@ -180,7 +180,7 @@ class Item extends Component {
let { item } = this.props; let { item } = this.props;
return ( return (
<tr onMouseOver={this.handleMouseOver} onMouseOut={this.handleMouseOut}> <tr onMouseOver={this.handleMouseOver} onMouseOut={this.handleMouseOut}>
<td><a href={siteRoot + 'useradmin/info/' + item.email + '/'}>{item.name}</a></td> <td><UserLink email={item.email} name={item.name} /></td>
<td>{this.getOperationText(item.operation)}</td> <td>{this.getOperationText(item.operation)}</td>
<td> <td>
<span dangerouslySetInnerHTML={{__html: this.getOperationDetail(item)}}></span> <span dangerouslySetInnerHTML={{__html: this.getOperationDetail(item)}}></span>

View File

@@ -4,7 +4,7 @@ import { seafileAPI } from '../../../utils/seafile-api';
import { Utils } from '../../../utils/utils.js'; import { Utils } from '../../../utils/utils.js';
import toaster from '../../../components/toast'; import toaster from '../../../components/toast';
import RoleEditor from '../../../components/select-editor/role-editor'; import RoleEditor from '../../../components/select-editor/role-editor';
import { serviceURL } from '../../../utils/constants'; import UserLink from '../user-link';
const MemberItemPropTypes = { const MemberItemPropTypes = {
groupID: PropTypes.string.isRequired, groupID: PropTypes.string.isRequired,
@@ -49,19 +49,18 @@ class MemberItem extends React.Component {
toaster.danger(errMessage); toaster.danger(errMessage);
}); });
this.setState({ this.setState({
highlight: false, highlight: false
}); });
} }
render() { render() {
const member = this.props.member; const member = this.props.member;
const highlight = this.state.highlight; const highlight = this.state.highlight;
let memberLink = serviceURL + '/useradmin/info/' + member.email + '/';
if (member.role === 'Owner') return null; if (member.role === 'Owner') return null;
return ( return (
<tr className={highlight ? 'tr-highlight' : ''} onMouseEnter={this.onMouseEnter} onMouseLeave={this.onMouseLeave}> <tr className={highlight ? 'tr-highlight' : ''} onMouseEnter={this.onMouseEnter} onMouseLeave={this.onMouseLeave}>
<td><img src={member.avatar_url} alt="member-header" width="24" className="avatar"/></td> <td><img src={member.avatar_url} alt="member-header" width="24" className="avatar"/></td>
<td><a href={memberLink}>{member.name}</a></td> <td><UserLink email={member.email} name={member.name} /></td>
<td> <td>
<RoleEditor <RoleEditor
isTextMode={true} isTextMode={true}

View File

@@ -10,6 +10,7 @@ import Loading from '../../../components/loading';
import { Link } from '@reach/router'; import { Link } from '@reach/router';
import DevicesNav from './devices-nav'; import DevicesNav from './devices-nav';
import MainPanelTopbar from '../main-panel-topbar'; import MainPanelTopbar from '../main-panel-topbar';
import UserLink from '../user-link';
class Content extends Component { class Content extends Component {
@@ -76,7 +77,7 @@ class Item extends Component {
let item = this.props.item; let item = this.props.item;
return ( return (
<tr onMouseEnter={this.handleMouseOver} onMouseLeave={this.handleMouseOut}> <tr onMouseEnter={this.handleMouseOver} onMouseLeave={this.handleMouseOut}>
<td><Link to={`${siteRoot}useradmin/info/${encodeURIComponent(item.email)}/`}>{item.name}</Link></td> <td><UserLink email={item.email} name={item.name} /></td>
<td>{item.device_name}{' / '}{item.client_version}</td> <td>{item.device_name}{' / '}{item.client_version}</td>
<td>{item.device_ip}</td> <td>{item.device_ip}</td>
<td><Link to={`${siteRoot}sysadmin/#libs/${item.repo_id}`}>{item.repo_name}</Link></td> <td><Link to={`${siteRoot}sysadmin/#libs/${item.repo_id}`}>{item.repo_name}</Link></td>

View File

@@ -10,6 +10,7 @@ import CommonOperationConfirmationDialog from '../../../components/dialog/common
import SysAdminGroupAddMemberDialog from '../../../components/dialog/sysadmin-dialog/sysadmin-group-add-member-dialog'; import SysAdminGroupAddMemberDialog from '../../../components/dialog/sysadmin-dialog/sysadmin-group-add-member-dialog';
import SysAdminGroupRoleEditor from '../../../components/select-editor/sysadmin-group-role-editor'; import SysAdminGroupRoleEditor from '../../../components/select-editor/sysadmin-group-role-editor';
import MainPanelTopbar from '../main-panel-topbar'; import MainPanelTopbar from '../main-panel-topbar';
import UserLink from '../user-link';
import GroupNav from './group-nav'; import GroupNav from './group-nav';
class Content extends Component { class Content extends Component {
@@ -105,7 +106,7 @@ class Item extends Component {
<Fragment> <Fragment>
<tr onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave}> <tr onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave}>
<td><img src={item.avatar_url} alt="" className="rounded-circle" width="24" /></td> <td><img src={item.avatar_url} alt="" className="rounded-circle" width="24" /></td>
<td><a href={`${siteRoot}useradmin/info/${encodeURIComponent(item.email)}/`}>{item.name}</a></td> <td><UserLink email={item.email} name={item.name} /></td>
<td> <td>
{item.role == 'Owner' ? {item.role == 'Owner' ?
gettext('Owner') : gettext('Owner') :

View File

@@ -7,6 +7,7 @@ import EmptyTip from '../../../components/empty-tip';
import Loading from '../../../components/loading'; import Loading from '../../../components/loading';
import CommonOperationConfirmationDialog from '../../../components/dialog/common-operation-confirmation-dialog'; import CommonOperationConfirmationDialog from '../../../components/dialog/common-operation-confirmation-dialog';
import MainPanelTopbar from '../main-panel-topbar'; import MainPanelTopbar from '../main-panel-topbar';
import UserLink from '../user-link';
import GroupNav from './group-nav'; import GroupNav from './group-nav';
const { enableSysAdminViewRepo } = window.sysadmin.pageOptions; const { enableSysAdminViewRepo } = window.sysadmin.pageOptions;
@@ -121,7 +122,7 @@ class Item extends Component {
<td>{this.renderRepoName()}</td> <td>{this.renderRepoName()}</td>
<td>{Utils.bytesToSize(item.size)}</td> <td>{Utils.bytesToSize(item.size)}</td>
<td> <td>
<a href={`${siteRoot}useradmin/info/${encodeURIComponent(item.shared_by)}/`}>{item.shared_by_name}</a> <UserLink email={item.shared_by} name={item.shared_by_name} />
</td> </td>
<td> <td>
<a href="#" className={`action-icon sf2-icon-x3 ${isOpIconShown ? '' : 'invisible'}`} title={gettext('Unshare')} onClick={this.toggleUnshareRepoDialog}></a> <a href="#" className={`action-icon sf2-icon-x3 ${isOpIconShown ? '' : 'invisible'}`} title={gettext('Unshare')} onClick={this.toggleUnshareRepoDialog}></a>

View File

@@ -13,6 +13,7 @@ import CommonOperationConfirmationDialog from '../../../components/dialog/common
import SysAdminCreateGroupDialog from '../../../components/dialog/sysadmin-dialog/sysadmin-create-group-dialog'; import SysAdminCreateGroupDialog from '../../../components/dialog/sysadmin-dialog/sysadmin-create-group-dialog';
import SysAdminTransferGroupDialog from '../../../components/dialog/sysadmin-dialog/sysadmin-group-transfer-dialog'; import SysAdminTransferGroupDialog from '../../../components/dialog/sysadmin-dialog/sysadmin-group-transfer-dialog';
import MainPanelTopbar from '../main-panel-topbar'; import MainPanelTopbar from '../main-panel-topbar';
import UserLink from '../user-link';
import OpMenu from './op-menu'; import OpMenu from './op-menu';
class Content extends Component { class Content extends Component {
@@ -182,7 +183,7 @@ class Item extends Component {
<td> <td>
{item.owner == 'system admin' ? {item.owner == 'system admin' ?
'--' : '--' :
<Link to={`${siteRoot}sys/users/${encodeURIComponent(item.owner)}/`}>{item.owner_name}</Link> <UserLink email={item.owner} name={item.owner_name} />
} }
</td> </td>
<td> <td>

View File

@@ -2,11 +2,12 @@ import React, { Component, Fragment } from 'react';
import moment from 'moment'; import moment from 'moment';
import { Utils } from '../../../utils/utils'; import { Utils } from '../../../utils/utils';
import { seafileAPI } from '../../../utils/seafile-api'; import { seafileAPI } from '../../../utils/seafile-api';
import { siteRoot, loginUrl, gettext } from '../../../utils/constants'; import { loginUrl, gettext } from '../../../utils/constants';
import toaster from '../../../components/toast'; import toaster from '../../../components/toast';
import EmptyTip from '../../../components/empty-tip'; import EmptyTip from '../../../components/empty-tip';
import Loading from '../../../components/loading'; import Loading from '../../../components/loading';
import CommonOperationConfirmationDialog from '../../../components/dialog/common-operation-confirmation-dialog'; import CommonOperationConfirmationDialog from '../../../components/dialog/common-operation-confirmation-dialog';
import UserLink from '../user-link';
import MainPanelTopbar from '../main-panel-topbar'; import MainPanelTopbar from '../main-panel-topbar';
import InstitutionNav from './institution-nav'; import InstitutionNav from './institution-nav';
import OpMenu from './user-op-menu'; import OpMenu from './user-op-menu';
@@ -142,7 +143,9 @@ class Item extends Component {
return ( return (
<Fragment> <Fragment>
<tr className={this.state.highlight ? 'tr-highlight' : ''} onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave}> <tr className={this.state.highlight ? 'tr-highlight' : ''} onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave}>
<td><a href={`${siteRoot}useradmin/info/${encodeURIComponent(item.email)}/`}>{item.name}</a></td> <td>
<UserLink email={item.email} name={item.name} />
</td>
<td> <td>
{item.is_active ? gettext('Active') : gettext('Inactive')} {item.is_active ? gettext('Active') : gettext('Inactive')}
</td> </td>
@@ -224,7 +227,7 @@ class InstitutionAdmins extends Component {
revokeAdmin = (email) => { revokeAdmin = (email) => {
seafileAPI.sysAdminUpdateInstitutionUser(this.props.institutionID, email, false).then(res => { seafileAPI.sysAdminUpdateInstitutionUser(this.props.institutionID, email, false).then(res => {
let userList = this.state.userList.filter(user => { let userList = this.state.userList.filter(user => {
return user.email != email return user.email != email;
}); });
this.setState({userList: userList}); this.setState({userList: userList});
toaster.success(gettext('Success')); toaster.success(gettext('Success'));

View File

@@ -3,15 +3,16 @@ import { Button } from 'reactstrap';
import moment from 'moment'; import moment from 'moment';
import { Utils } from '../../../utils/utils'; import { Utils } from '../../../utils/utils';
import { seafileAPI } from '../../../utils/seafile-api'; import { seafileAPI } from '../../../utils/seafile-api';
import { siteRoot, loginUrl, gettext } from '../../../utils/constants'; import { loginUrl, gettext } from '../../../utils/constants';
import toaster from '../../../components/toast'; import toaster from '../../../components/toast';
import EmptyTip from '../../../components/empty-tip'; import EmptyTip from '../../../components/empty-tip';
import Loading from '../../../components/loading'; import Loading from '../../../components/loading';
import Paginator from '../../../components/paginator';
import AddMemberDialog from '../../../components/dialog/sysadmin-dialog/sysadmin-add-institution-member-dialog'; import AddMemberDialog from '../../../components/dialog/sysadmin-dialog/sysadmin-add-institution-member-dialog';
import CommonOperationConfirmationDialog from '../../../components/dialog/common-operation-confirmation-dialog'; import CommonOperationConfirmationDialog from '../../../components/dialog/common-operation-confirmation-dialog';
import UserLink from '../user-link';
import MainPanelTopbar from '../main-panel-topbar'; import MainPanelTopbar from '../main-panel-topbar';
import InstitutionNav from './institution-nav'; import InstitutionNav from './institution-nav';
import Paginator from '../../../components/paginator';
import OpMenu from './user-op-menu'; import OpMenu from './user-op-menu';
class Content extends Component { class Content extends Component {
@@ -175,7 +176,9 @@ class Item extends Component {
return ( return (
<Fragment> <Fragment>
<tr className={this.state.highlight ? 'tr-highlight' : ''} onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave}> <tr className={this.state.highlight ? 'tr-highlight' : ''} onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave}>
<td><a href={`${siteRoot}useradmin/info/${encodeURIComponent(item.email)}/`}>{item.name}</a></td> <td>
<UserLink email={item.email} name={item.name} />
</td>
<td> <td>
{item.is_active ? gettext('Active') : gettext('Inactive')} {item.is_active ? gettext('Active') : gettext('Inactive')}
</td> </td>

View File

@@ -10,6 +10,7 @@ import EmptyTip from '../../../components/empty-tip';
import Loading from '../../../components/loading'; import Loading from '../../../components/loading';
import Paginator from '../../../components/paginator'; import Paginator from '../../../components/paginator';
import MainPanelTopbar from '../main-panel-topbar'; import MainPanelTopbar from '../main-panel-topbar';
import UserLink from '../user-link';
import OpMenu from './op-menu'; import OpMenu from './op-menu';
class Content extends Component { class Content extends Component {
@@ -174,11 +175,11 @@ class Item extends Component {
<Fragment> <Fragment>
<tr className={this.state.highlight ? 'tr-highlight' : ''} onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave}> <tr className={this.state.highlight ? 'tr-highlight' : ''} onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave}>
<td> <td>
<Link to={`${siteRoot}sys/users/${encodeURIComponent(item.inviter_email)}/`}>{item.inviter_name}</Link> <UserLink email={item.inviter_email} name={item.inviter_name} />
</td> </td>
<td> <td>
{item.accept_time ? {item.accept_time ?
<Link to={`${siteRoot}sys/users/${encodeURIComponent(item.accepter_email)}/`}>{item.accepter_name}</Link> : <UserLink email={item.accepter_email} name={item.accepter_name} /> :
item.accepter_email item.accepter_email
} }
</td> </td>

View File

@@ -9,7 +9,7 @@ import Loading from '../../../components/loading';
import Paginator from '../../../components/paginator'; import Paginator from '../../../components/paginator';
import LinksNav from './links-nav'; import LinksNav from './links-nav';
import MainPanelTopbar from '../main-panel-topbar'; import MainPanelTopbar from '../main-panel-topbar';
import UserLink from '../user-link';
class Content extends Component { class Content extends Component {
@@ -111,7 +111,7 @@ class Item extends Component {
<tr onMouseOver={this.handleMouseOver} onMouseOut={this.handleMouseOut}> <tr onMouseOver={this.handleMouseOver} onMouseOut={this.handleMouseOut}>
<td>{item.obj_name}</td> <td>{item.obj_name}</td>
<td>{item.token}</td> <td>{item.token}</td>
<td><a href={siteRoot + 'useradmin/info/' + item.creator_email + '/'}>{item.creator_name}</a></td> <td><UserLink email={item.creator_email} name={item.creator_name} /></td>
<td>{moment(item.ctime).fromNow()}</td> <td>{moment(item.ctime).fromNow()}</td>
<td>{item.view_cnt}</td> <td>{item.view_cnt}</td>
<td> <td>

View File

@@ -9,6 +9,7 @@ import Loading from '../../../components/loading';
import Paginator from '../../../components/paginator'; import Paginator from '../../../components/paginator';
import LinksNav from './links-nav'; import LinksNav from './links-nav';
import MainPanelTopbar from '../main-panel-topbar'; import MainPanelTopbar from '../main-panel-topbar';
import UserLink from '../user-link';
class Content extends Component { class Content extends Component {
@@ -112,7 +113,7 @@ class Item extends Component {
<tr onMouseOver={this.handleMouseOver} onMouseOut={this.handleMouseOut}> <tr onMouseOver={this.handleMouseOver} onMouseOut={this.handleMouseOut}>
<td>{item.path}</td> <td>{item.path}</td>
<td>{item.token}</td> <td>{item.token}</td>
<td><a href={siteRoot + 'useradmin/info/' + item.creator_email + '/'}>{item.creator_name}</a></td> <td><UserLink email={item.creator_email} name={item.creator_name} /></td>
<td>{moment(item.ctime).fromNow()}</td> <td>{moment(item.ctime).fromNow()}</td>
<td>{item.view_cnt}</td> <td>{item.view_cnt}</td>
<td> <td>

View File

@@ -8,6 +8,7 @@ import Loading from '../../../components/loading';
import Paginator from '../../../components/paginator'; import Paginator from '../../../components/paginator';
import LogsNav from './logs-nav'; import LogsNav from './logs-nav';
import MainPanelTopbar from '../main-panel-topbar'; import MainPanelTopbar from '../main-panel-topbar';
import UserLink from '../user-link';
import LogsExportExcelDialog from '../../../components/dialog/sysadmin-dialog/sysadmin-logs-export-excel-dialog'; import LogsExportExcelDialog from '../../../components/dialog/sysadmin-dialog/sysadmin-logs-export-excel-dialog';
import ModalPortal from '../../../components/modal-portal'; import ModalPortal from '../../../components/modal-portal';
@@ -103,7 +104,7 @@ class Item extends Component {
let { item } = this.props; let { item } = this.props;
return ( return (
<tr onMouseOver={this.handleMouseOver} onMouseOut={this.handleMouseOut}> <tr onMouseOver={this.handleMouseOver} onMouseOut={this.handleMouseOut}>
<td><a href={siteRoot + 'useradmin/info/' + item.email + '/'}>{item.name}</a></td> <td><UserLink email={item.email} name={item.name} /></td>
<td>{item.event_type}</td> <td>{item.event_type}</td>
<td>{item.ip}{' / '}{item.device}</td> <td>{item.ip}{' / '}{item.device}</td>
<td>{moment(item.time).fromNow()}</td> <td>{moment(item.time).fromNow()}</td>

View File

@@ -8,6 +8,7 @@ import Paginator from '../../../components/paginator';
import LogsNav from './logs-nav'; import LogsNav from './logs-nav';
import { Button } from 'reactstrap'; import { Button } from 'reactstrap';
import MainPanelTopbar from '../main-panel-topbar'; import MainPanelTopbar from '../main-panel-topbar';
import UserLink from '../user-link';
import ModalPortal from '../../../components/modal-portal'; import ModalPortal from '../../../components/modal-portal';
import CommitDetails from '../../../components/dialog/commit-details'; import CommitDetails from '../../../components/dialog/commit-details';
import LogsExportExcelDialog from '../../../components/dialog/sysadmin-dialog/sysadmin-logs-export-excel-dialog'; import LogsExportExcelDialog from '../../../components/dialog/sysadmin-dialog/sysadmin-logs-export-excel-dialog';
@@ -117,7 +118,7 @@ class Item extends Component {
return ( return (
<Fragment> <Fragment>
<tr onMouseOver={this.handleMouseOver} onMouseOut={this.handleMouseOut}> <tr onMouseOver={this.handleMouseOver} onMouseOut={this.handleMouseOut}>
<td><a href={siteRoot + 'useradmin/info/' + item.email + '/'}>{item.name}</a></td> <td><UserLink email={item.email} name={item.name} /></td>
<td>{moment(item.time).fromNow()}</td> <td>{moment(item.time).fromNow()}</td>
<td>{item.repo_name ? item.repo_name : gettext('Deleted')}</td> <td>{item.repo_name ? item.repo_name : gettext('Deleted')}</td>
<td> <td>

View File

@@ -9,6 +9,7 @@ import Loading from '../../../components/loading';
import Paginator from '../../../components/paginator'; import Paginator from '../../../components/paginator';
import LogsNav from './logs-nav'; import LogsNav from './logs-nav';
import MainPanelTopbar from '../main-panel-topbar'; import MainPanelTopbar from '../main-panel-topbar';
import UserLink from '../user-link';
import LogsExportExcelDialog from '../../../components/dialog/sysadmin-dialog/sysadmin-logs-export-excel-dialog'; import LogsExportExcelDialog from '../../../components/dialog/sysadmin-dialog/sysadmin-logs-export-excel-dialog';
import ModalPortal from '../../../components/modal-portal'; import ModalPortal from '../../../components/modal-portal';
@@ -102,7 +103,7 @@ class Item extends Component {
let { item } = this.props; let { item } = this.props;
return ( return (
<tr onMouseOver={this.handleMouseOver} onMouseOut={this.handleMouseOut}> <tr onMouseOver={this.handleMouseOver} onMouseOut={this.handleMouseOut}>
<td><a href={siteRoot + 'useradmin/info/' + item.email + '/'}>{item.name}</a></td> <td><UserLink email={item.email} name={item.name} /></td>
<td>{item.login_ip}</td> <td>{item.login_ip}</td>
<td>{item.log_success ? gettext('Success') : gettext('Failed')}</td> <td>{item.log_success ? gettext('Success') : gettext('Failed')}</td>
<td>{moment(item.login_time).fromNow()}</td> <td>{moment(item.login_time).fromNow()}</td>

View File

@@ -9,6 +9,7 @@ import Loading from '../../../components/loading';
import Paginator from '../../../components/paginator'; import Paginator from '../../../components/paginator';
import LogsNav from './logs-nav'; import LogsNav from './logs-nav';
import MainPanelTopbar from '../main-panel-topbar'; import MainPanelTopbar from '../main-panel-topbar';
import UserLink from '../user-link';
import LogsExportExcelDialog from '../../../components/dialog/sysadmin-dialog/sysadmin-logs-export-excel-dialog'; import LogsExportExcelDialog from '../../../components/dialog/sysadmin-dialog/sysadmin-logs-export-excel-dialog';
import ModalPortal from '../../../components/modal-portal'; import ModalPortal from '../../../components/modal-portal';
@@ -116,8 +117,8 @@ class Item extends Component {
let { item } = this.props; let { item } = this.props;
return ( return (
<tr onMouseOver={this.handleMouseOver} onMouseOut={this.handleMouseOut}> <tr onMouseOver={this.handleMouseOver} onMouseOut={this.handleMouseOut}>
<td><a href={siteRoot + 'useradmin/info/' + item.from_user_email + '/'}>{item.from_user_name}</a></td> <td><UserLink email={item.from_user_email} name={item.from_user_name} /></td>
<td><a href={siteRoot + 'useradmin/info/' + item.to_user_email + '/'}>{item.to_user_name}</a></td> <td><UserLink email={item.to_user_email} name={item.to_user_name} /></td>
<td>{this.getActionTextByEType(item.etype)}</td> <td>{this.getActionTextByEType(item.etype)}</td>
<td>{Utils.sharePerms(item.permission)}</td> <td>{Utils.sharePerms(item.permission)}</td>
<td>{item.repo_name ? item.repo_name : gettext('Deleted')}</td> <td>{item.repo_name ? item.repo_name : gettext('Deleted')}</td>

View File

@@ -8,6 +8,7 @@ import EmptyTip from '../../../components/empty-tip';
import Loading from '../../../components/loading'; import Loading from '../../../components/loading';
import CommonOperationConfirmationDialog from '../../../components/dialog/common-operation-confirmation-dialog'; import CommonOperationConfirmationDialog from '../../../components/dialog/common-operation-confirmation-dialog';
import MainPanelTopbar from '../main-panel-topbar'; import MainPanelTopbar from '../main-panel-topbar';
import UserLink from '../user-link';
import OrgNav from './org-nav'; import OrgNav from './org-nav';
class Content extends Component { class Content extends Component {
@@ -101,7 +102,7 @@ class Item extends Component {
<Fragment> <Fragment>
<tr onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave}> <tr onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave}>
<td><a href={groupUrl}>{item.group_name}</a></td> <td><a href={groupUrl}>{item.group_name}</a></td>
<td><a href={`${siteRoot}useradmin/info/${encodeURIComponent(item.creator_email)}/`}>{item.creator_name}</a></td> <td><UserLink email={item.creator_email} name={item.creator_name} /></td>
<td>{moment(item.created_at).format('YYYY-MM-DD hh:mm:ss')}</td> <td>{moment(item.created_at).format('YYYY-MM-DD hh:mm:ss')}</td>
<td> <td>
<a href="#" className={`action-icon sf2-icon-delete ${isOpIconShown ? '' : 'invisible'}`} title={gettext('Delete')} onClick={this.toggleDeleteDialog}></a> <a href="#" className={`action-icon sf2-icon-delete ${isOpIconShown ? '' : 'invisible'}`} title={gettext('Delete')} onClick={this.toggleDeleteDialog}></a>

View File

@@ -7,6 +7,7 @@ import EmptyTip from '../../../components/empty-tip';
import Loading from '../../../components/loading'; import Loading from '../../../components/loading';
import CommonOperationConfirmationDialog from '../../../components/dialog/common-operation-confirmation-dialog'; import CommonOperationConfirmationDialog from '../../../components/dialog/common-operation-confirmation-dialog';
import MainPanelTopbar from '../main-panel-topbar'; import MainPanelTopbar from '../main-panel-topbar';
import UserLink from '../user-link';
import OrgNav from './org-nav'; import OrgNav from './org-nav';
class Content extends Component { class Content extends Component {
@@ -103,7 +104,7 @@ class Item extends Component {
<td>{item.repo_id}</td> <td>{item.repo_id}</td>
<td> <td>
{item.owner_email ? {item.owner_email ?
<a href={`${siteRoot}useradmin/info/${encodeURIComponent(item.owner_email)}/`}>{item.owner_name}</a> : <UserLink email={item.owner_email} name={item.owner_name} /> :
'--' '--'
} }
</td> </td>

View File

@@ -11,6 +11,7 @@ import SysAdminUserStatusEditor from '../../../components/select-editor/sysadmin
import SysAdminAddUserDialog from '../../../components/dialog/sysadmin-dialog/sysadmin-add-user-dialog'; import SysAdminAddUserDialog from '../../../components/dialog/sysadmin-dialog/sysadmin-add-user-dialog';
import CommonOperationConfirmationDialog from '../../../components/dialog/common-operation-confirmation-dialog'; import CommonOperationConfirmationDialog from '../../../components/dialog/common-operation-confirmation-dialog';
import MainPanelTopbar from '../main-panel-topbar'; import MainPanelTopbar from '../main-panel-topbar';
import UserLink from '../user-link';
import OrgNav from './org-nav'; import OrgNav from './org-nav';
import OpMenu from './user-op-menu'; import OpMenu from './user-op-menu';
@@ -170,7 +171,7 @@ class Item extends Component {
return ( return (
<Fragment> <Fragment>
<tr className={this.state.highlight ? 'tr-highlight' : ''} onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave}> <tr className={this.state.highlight ? 'tr-highlight' : ''} onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave}>
<td><a href={`${siteRoot}useradmin/info/${encodeURIComponent(item.email)}/`}>{item.name}</a></td> <td><UserLink email={item.email} name={item.name} /></td>
<td> <td>
<SysAdminUserStatusEditor <SysAdminUserStatusEditor
isTextMode={true} isTextMode={true}

View File

@@ -12,6 +12,7 @@ import SysAdminUserRoleEditor from '../../../components/select-editor/sysadmin-u
import SysAdminAddOrgDialog from '../../../components/dialog/sysadmin-dialog/sysadmin-add-org-dialog'; import SysAdminAddOrgDialog from '../../../components/dialog/sysadmin-dialog/sysadmin-add-org-dialog';
import CommonOperationConfirmationDialog from '../../../components/dialog/common-operation-confirmation-dialog'; import CommonOperationConfirmationDialog from '../../../components/dialog/common-operation-confirmation-dialog';
import MainPanelTopbar from '../main-panel-topbar'; import MainPanelTopbar from '../main-panel-topbar';
import UserLink from '../user-link';
const { availableRoles } = window.sysadmin.pageOptions; const { availableRoles } = window.sysadmin.pageOptions;
@@ -108,7 +109,9 @@ class Item extends Component {
<Fragment> <Fragment>
<tr onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave}> <tr onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave}>
<td><Link to={`${siteRoot}sys/organizations/${item.org_id}/info/`}>{item.org_name}</Link></td> <td><Link to={`${siteRoot}sys/organizations/${item.org_id}/info/`}>{item.org_name}</Link></td>
<td><a href={`${siteRoot}useradmin/info/${encodeURIComponent(item.creator_email)}/`}>{item.creator_name}</a></td> <td>
<UserLink email={item.creator_email} name={item.creator_name} />
</td>
<td> <td>
<SysAdminUserRoleEditor <SysAdminUserRoleEditor
isTextMode={true} isTextMode={true}

View File

@@ -15,6 +15,7 @@ import SysAdminShareDialog from '../../../components/dialog/sysadmin-dialog/sysa
import SysAdminLibHistorySettingDialog from '../../../components/dialog/sysadmin-dialog/sysadmin-lib-history-setting-dialog'; import SysAdminLibHistorySettingDialog from '../../../components/dialog/sysadmin-dialog/sysadmin-lib-history-setting-dialog';
import SysAdminCreateRepoDialog from '../../../components/dialog/sysadmin-dialog/sysadmin-create-repo-dialog'; import SysAdminCreateRepoDialog from '../../../components/dialog/sysadmin-dialog/sysadmin-create-repo-dialog';
import MainPanelTopbar from '../main-panel-topbar'; import MainPanelTopbar from '../main-panel-topbar';
import UserLink from '../user-link';
import ReposNav from './repos-nav'; import ReposNav from './repos-nav';
import RepoOpMenu from './repo-op-menu'; import RepoOpMenu from './repo-op-menu';
@@ -231,7 +232,7 @@ class Item extends Component {
<td> <td>
{isGroupOwnedRepo ? {isGroupOwnedRepo ?
<Link to={`${siteRoot}sys/departments/${repo.owner_name}/`}>{repo.group_name}</Link> : <Link to={`${siteRoot}sys/departments/${repo.owner_name}/`}>{repo.group_name}</Link> :
<Link to={`${siteRoot}sys/users/${encodeURIComponent(repo.owner_email)}/`}>{repo.owner_name}</Link> <UserLink email={repo.owner_email} name={repo.owner_name} />
} }
</td> </td>
<td> <td>

View File

@@ -1,15 +1,16 @@
import React, { Component, Fragment } from 'react'; import React, { Component, Fragment } from 'react';
import { Button } from 'reactstrap'; import { Button } from 'reactstrap';
import { seafileAPI } from '../../../utils/seafile-api';
import { gettext ,siteRoot } from '../../../utils/constants';
import toaster from '../../../components/toast';
import { Utils } from '../../../utils/utils';
import EmptyTip from '../../../components/empty-tip';
import moment from 'moment'; import moment from 'moment';
import { Utils } from '../../../utils/utils';
import { seafileAPI } from '../../../utils/seafile-api';
import { gettext } from '../../../utils/constants';
import toaster from '../../../components/toast';
import EmptyTip from '../../../components/empty-tip';
import Loading from '../../../components/loading'; import Loading from '../../../components/loading';
import Paginator from '../../../components/paginator'; import Paginator from '../../../components/paginator';
import ModalPortal from '../../../components/modal-portal'; import ModalPortal from '../../../components/modal-portal';
import CommonOperationConfirmationDialog from '../../../components/dialog/common-operation-confirmation-dialog'; import CommonOperationConfirmationDialog from '../../../components/dialog/common-operation-confirmation-dialog';
import UserLink from '../user-link';
import ReposNav from './repos-nav'; import ReposNav from './repos-nav';
import MainPanelTopbar from '../main-panel-topbar'; import MainPanelTopbar from '../main-panel-topbar';
@@ -155,7 +156,8 @@ class Item extends Component {
<td>{repo.name}</td> <td>{repo.name}</td>
<td> <td>
{repo.owner.indexOf('@seafile_group') == -1 ? {repo.owner.indexOf('@seafile_group') == -1 ?
<a href={`${siteRoot}useradmin/info/${encodeURIComponent(repo.owner)}/`}>{repo.owner_name}</a> : repo.group_name} <UserLink email={repo.owner} name={repo.owner_name} /> :
repo.group_name}
</td> </td>
<td>{moment(repo.delete_time).fromNow()}</td> <td>{moment(repo.delete_time).fromNow()}</td>
<td> <td>

View File

@@ -0,0 +1,20 @@
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { Link } from '@reach/router';
import { siteRoot } from '../../utils/constants';
const propTypes = {
email: PropTypes.string.isRequired,
name: PropTypes.string.isRequired
};
class UserLink extends Component {
render() {
return <Link to={`${siteRoot}sys/users/${encodeURIComponent(this.props.email)}/`}>{this.props.name}</Link>;
}
}
UserLink.propTypes = propTypes;
export default UserLink;

View File

@@ -9,6 +9,7 @@ import Loading from '../../../components/loading';
import Paginator from '../../../components/paginator'; import Paginator from '../../../components/paginator';
import UsersNav from './users-nav'; import UsersNav from './users-nav';
import MainPanelTopbar from '../main-panel-topbar'; import MainPanelTopbar from '../main-panel-topbar';
import UserLink from '../user-link';
class Content extends Component { class Content extends Component {
@@ -84,9 +85,7 @@ class Item extends Component {
return ( return (
<Fragment> <Fragment>
<tr> <tr>
<td> <td><UserLink email={item.email} name={item.email} /></td>
<Link to={`${siteRoot}sys/users/${encodeURIComponent(item.email)}/`}>{item.email}</Link>
</td>
<td> <td>
{`${Utils.bytesToSize(item.quota_usage)} / ${item.quota_total > 0 ? Utils.bytesToSize(item.quota_total) : '--'}`} {`${Utils.bytesToSize(item.quota_usage)} / ${item.quota_total > 0 ? Utils.bytesToSize(item.quota_total) : '--'}`}
</td> </td>

View File

@@ -10,6 +10,7 @@ import Loading from '../../../components/loading';
import CommonOperationConfirmationDialog from '../../../components/dialog/common-operation-confirmation-dialog'; import CommonOperationConfirmationDialog from '../../../components/dialog/common-operation-confirmation-dialog';
import TransferDialog from '../../../components/dialog/transfer-dialog'; import TransferDialog from '../../../components/dialog/transfer-dialog';
import MainPanelTopbar from '../main-panel-topbar'; import MainPanelTopbar from '../main-panel-topbar';
import UserLink from '../user-link';
import Nav from './user-nav'; import Nav from './user-nav';
import OpMenu from './user-op-menu'; import OpMenu from './user-op-menu';
@@ -82,17 +83,17 @@ class Item extends Component {
} }
} }
getOwnerUrl = () => { getOwnerLink = () => {
let url; let link;
const { item } = this.props; const { item } = this.props;
const index = item.owner_email.indexOf('@seafile_group'); const index = item.owner_email.indexOf('@seafile_group');
if (index == -1) { if (index == -1) {
url = `${siteRoot}sys/users/${encodeURIComponent(item.owner_email)}/`; link = <UserLink email={item.owner_email} name={item.owner_name} />;
} else { } else {
const groupID = item.owner_email.substring(0, index); const groupID = item.owner_email.substring(0, index);
url = `${siteRoot}sys/departments/${groupID}/`; link = <Link to={`${siteRoot}sys/departments/${groupID}/`}>{item.owner_name}</Link>;
} }
return url; return link;
} }
render() { render() {
@@ -104,7 +105,7 @@ class Item extends Component {
<tr> <tr>
<td><img src={iconUrl} title={iconTitle} alt={iconTitle} width="24" /></td> <td><img src={iconUrl} title={iconTitle} alt={iconTitle} width="24" /></td>
<td>{this.renderRepoName()}</td> <td>{this.renderRepoName()}</td>
<td><Link to={this.getOwnerUrl()}>{item.owner_name}</Link></td> <td>{this.getOwnerLink()}</td>
<td>{Utils.bytesToSize(item.size)}</td> <td>{Utils.bytesToSize(item.size)}</td>
<td>{moment(item.last_modify).fromNow()}</td> <td>{moment(item.last_modify).fromNow()}</td>
</tr> </tr>

View File

@@ -20,6 +20,7 @@ import CommonOperationConfirmationDialog from '../../../components/dialog/common
import SysAdminUser from '../../../models/sysadmin-user'; import SysAdminUser from '../../../models/sysadmin-user';
import SysAdminAdminUser from '../../../models/sysadmin-admin-user'; import SysAdminAdminUser from '../../../models/sysadmin-admin-user';
import MainPanelTopbar from '../main-panel-topbar'; import MainPanelTopbar from '../main-panel-topbar';
import UserLink from '../user-link';
import UsersNav from './users-nav'; import UsersNav from './users-nav';
import OpMenu from './user-op-menu'; import OpMenu from './user-op-menu';
@@ -333,7 +334,7 @@ class Item extends Component {
<input type="checkbox" className="vam" onChange={this.onUserSelected} checked={item.isSelected} /> <input type="checkbox" className="vam" onChange={this.onUserSelected} checked={item.isSelected} />
</td> </td>
<td> <td>
<Link to={`${siteRoot}sys/users/${encodeURIComponent(item.email)}/`}>{item.name}</Link> <UserLink email={item.email} name={item.name} />
{item.contact_email && {item.contact_email &&
<Fragment> <Fragment>
<br /> <br />