mirror of
https://github.com/haiwen/seahub.git
synced 2025-09-11 03:41:12 +00:00
[system admin] update user links (#4234)
This commit is contained in:
@@ -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>
|
||||||
|
@@ -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>
|
||||||
|
@@ -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}
|
||||||
@@ -84,4 +83,4 @@ class MemberItem extends React.Component {
|
|||||||
|
|
||||||
MemberItem.propTypes = MemberItemPropTypes;
|
MemberItem.propTypes = MemberItemPropTypes;
|
||||||
|
|
||||||
export default MemberItem;
|
export default MemberItem;
|
||||||
|
@@ -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>
|
||||||
|
@@ -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') :
|
||||||
|
@@ -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>
|
||||||
|
@@ -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>
|
||||||
|
@@ -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'));
|
||||||
|
@@ -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>
|
||||||
|
@@ -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>
|
||||||
|
@@ -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>
|
||||||
|
@@ -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>
|
||||||
|
@@ -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>
|
||||||
|
@@ -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>
|
||||||
|
@@ -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>
|
||||||
|
@@ -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>
|
||||||
|
@@ -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>
|
||||||
|
@@ -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>
|
||||||
|
@@ -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}
|
||||||
|
@@ -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}
|
||||||
|
@@ -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>
|
||||||
|
@@ -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>
|
||||||
|
20
frontend/src/pages/sys-admin/user-link.js
Normal file
20
frontend/src/pages/sys-admin/user-link.js
Normal 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;
|
@@ -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>
|
||||||
|
@@ -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>
|
||||||
|
@@ -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 />
|
||||||
|
Reference in New Issue
Block a user