1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-08-02 07:47:32 +00:00

[system admin] mobile: added toggle for the side panel; fixup for 'wechat', 'dingTalk', 'abuse reports' pages (#5362)

This commit is contained in:
llj 2023-01-29 18:16:00 +08:00 committed by GitHub
parent ff9a0e92f9
commit 139e8fb334
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
60 changed files with 172 additions and 195 deletions

View File

@ -5,6 +5,7 @@ import { Utils } from '../../utils/utils';
import { seafileAPI } from '../../utils/seafile-api';
import toaster from '../../components/toast';
import moment from 'moment';
import MainPanelTopbar from './main-panel-topbar';
class AbuseReports extends Component {
@ -76,23 +77,15 @@ class AbuseReports extends Component {
return (
<Fragment>
<div className="main-panel-north">
<div className="cur-view-toolbar">
<span className="sf2-icon-menu side-nav-toggle hidden-md-up d-md-none" title="Side Nav Menu"></span>
</div>
<div className="common-toolbar">
<Account isAdminPanel={true}/>
</div>
</div>
<MainPanelTopbar {...this.props} />
<div className="main-panel-center">
<div className="cur-view-container">
<div className="cur-view-path">
<h3 className="sf-heading">{gettext('Abuse Reports')}</h3>
</div>
<div className="cur-view-content">
<table className={`table-hover${isDesktop ? '' : ' table-thead-hidden'}`}>
<table className={`table-hover`}>
<thead>
{isDesktop ?
<tr>
<th width="20%">{gettext('Library')}</th>
<th width="20%">{gettext('File')}</th>
@ -102,12 +95,6 @@ class AbuseReports extends Component {
<th width="10%">{gettext('Time')}</th>
<th width="5%">{gettext('Handled')}</th>
</tr>
:
<tr>
<th width="92%"></th>
<th width="8%"></th>
</tr>
}
</thead>
<tbody>
{AbuseReportList}

View File

@ -146,7 +146,7 @@ class AdminLoginLogs extends Component {
let { logList, currentPage, perPage, hasNextPage } = this.state;
return (
<Fragment>
<MainPanelTopbar />
<MainPanelTopbar {...this.props} />
<div className="main-panel-center flex-row">
<div className="cur-view-container">
<LogsNav currentItem="adminLoginLogs" />

View File

@ -243,7 +243,7 @@ class AdminOperationLogs extends Component {
let { logList, currentPage, perPage, hasNextPage } = this.state;
return (
<Fragment>
<MainPanelTopbar />
<MainPanelTopbar {...this.props} />
<div className="main-panel-center flex-row">
<div className="cur-view-container">
<LogsNav currentItem="adminOperationLogs" />

View File

@ -280,7 +280,9 @@ class DepartmentDetail extends React.Component {
return (
<Fragment>
<MainPanelTopbar children={topbarChildren} />
<MainPanelTopbar {...this.props}>
{topbarChildren}
</MainPanelTopbar>
<div className="main-panel-center flex-row h-100">
<div className="cur-view-container o-auto">
<div className="cur-view-path">

View File

@ -98,7 +98,9 @@ class DepartmentsList extends React.Component {
);
return (
<Fragment>
<MainPanelTopbar children={topbarChildren}/>
<MainPanelTopbar {...this.props}>
{topbarChildren}
</MainPanelTopbar>
<div className="main-panel-center flex-row h-100">
<div className="cur-view-container o-auto">
<div className="cur-view-path">

View File

@ -12,7 +12,7 @@ class DesktopDevices extends Component {
render() {
return (
<Fragment>
<MainPanelTopbar />
<MainPanelTopbar {...this.props} />
<div className="main-panel-center flex-row">
<div className="cur-view-container">
<DevicesNav currentItem="desktop" />

View File

@ -174,11 +174,11 @@ class DeviceErrors extends Component {
return (
<Fragment>
{this.state.isCleanBtnShown ? (
<MainPanelTopbar>
<MainPanelTopbar {...this.props}>
<Button className="operation-item" onClick={this.clean}>{gettext('Clean')}</Button>
</MainPanelTopbar>
) : (
<MainPanelTopbar />
<MainPanelTopbar {...this.props} />
)}
<div className="main-panel-center flex-row">
<div className="cur-view-container">

View File

@ -12,7 +12,7 @@ class MobileDevices extends Component {
render() {
return (
<Fragment>
<MainPanelTopbar />
<MainPanelTopbar {...this.props} />
<div className="main-panel-center flex-row">
<div className="cur-view-container">
<DevicesNav currentItem="mobile" />

View File

@ -4,8 +4,8 @@ import deepCopy from 'deep-copy';
import { seafileAPI } from '../../utils/seafile-api';
import { gettext, siteRoot, isPro } from '../../utils/constants';
import { Utils } from '../../utils/utils';
import MainPanelTopbar from './main-panel-topbar';
import toaster from '../../components/toast';
import Account from '../../components/common/account';
import { DingtalkDepartmentMembersList, DingtalkDepartmentsTreePanel } from './dingtalk';
import ImportDingtalkDepartmentDialog from '../../components/dialog/import-dingtalk-department-dialog';
@ -289,28 +289,14 @@ class DingtalkDepartments extends Component {
this.getDingtalkDepartmentsList(null);
}
renderNav() {
const btnClass = 'btn btn-secondary operation-item ';
return (
<div className="main-panel-north border-left-show">
<div className="cur-view-toolbar">
<span className="sf2-icon-menu side-nav-toggle hidden-md-up d-md-none" title="Side Nav Menu"></span>
<Button className={btnClass + 'my-1 d-md-none'} onClick={this.onSubmit}>{'导入用户'}</Button>
<Button className={btnClass + 'hidden-md-up'} onClick={this.onSubmit}>{'导入用户'}</Button>
</div>
<div className="common-toolbar">
<Account isAdminPanel={true}/>
</div>
</div>
);
}
render() {
const { isImportDepartmentDialogShow, isTreeLoading, importDepartment, importDepartmentChildrenCount, importDepartmentMembersCount } = this.state;
let canImportDepartment = !!(isPro && isImportDepartmentDialogShow && !isTreeLoading && importDepartment);
return (
<Fragment>
{this.renderNav()}
<MainPanelTopbar {...this.props}>
<Button className="operation-item" onClick={this.onSubmit}>{'导入用户'}</Button>
</MainPanelTopbar>
<div className="main-panel-center">
<div className="cur-view-container">
<div className="cur-view-path">

View File

@ -3,7 +3,7 @@ import PropTypes from 'prop-types';
import { seafileAPI } from '../../utils/seafile-api';
import { gettext } from '../../utils/constants';
import { Utils } from '../../utils/utils';
import Account from '../../components/common/account';
import MainPanelTopbar from './main-panel-topbar';
const tablePropTypes = {
@ -104,14 +104,7 @@ class FileScanRecords extends Component {
render() {
return (
<React.Fragment>
<div className="main-panel-north">
<div className="cur-view-toolbar">
<span className="sf2-icon-menu side-nav-toggle hidden-md-up d-md-none" title="Side Nav Menu"></span>
</div>
<div className="common-toolbar">
<Account isAdminPanel={true} />
</div>
</div>
<MainPanelTopbar {...this.props} />
<div className="main-panel-center">
<div className="cur-view-container" id="content-scan-records">
<div className="cur-view-path">

View File

@ -277,7 +277,7 @@ class GroupMembers extends Component {
let { isAddMemberDialogOpen } = this.state;
return (
<Fragment>
<MainPanelTopbar>
<MainPanelTopbar {...this.props}>
<Button className="btn btn-secondary operation-item" onClick={this.toggleAddMemgerDialog}>{gettext('Add Member')}</Button>
</MainPanelTopbar>
<div className="main-panel-center flex-row">

View File

@ -189,7 +189,7 @@ class GroupRepos extends Component {
render() {
return (
<Fragment>
<MainPanelTopbar />
<MainPanelTopbar {...this.props} />
<div className="main-panel-center flex-row">
<div className="cur-view-container">
<GroupNav

View File

@ -125,7 +125,7 @@ class Groups extends Component {
return (
<Fragment>
<MainPanelTopbar search={this.getSearch()}>
<MainPanelTopbar search={this.getSearch()} {...this.props}>
<Fragment>
<Button className="operation-item" onClick={this.toggleCreateGroupDialog}>{gettext('New Group')}</Button>
<a className="btn btn-secondary operation-item" href={`${siteRoot}sys/groupadmin/export-excel/`}>{gettext('Export Excel')}</a>

View File

@ -94,7 +94,7 @@ class SearchGroups extends Component {
return (
<Fragment>
<MainPanelTopbar />
<MainPanelTopbar {...this.props} />
<div className="main-panel-center flex-row">
<div className="cur-view-container">
<div className="cur-view-path">

View File

@ -1,7 +1,11 @@
import React from 'react';
import ReactDom from 'react-dom';
import MediaQuery from 'react-responsive';
import { Modal } from 'reactstrap';
import { Router } from '@gatsbyjs/reach-router';
import { siteRoot } from '../../utils/constants';
import { Utils } from '../../utils/utils';
import SidePanel from './side-panel';
import MainPanel from './main-panel';
@ -16,7 +20,6 @@ import StatisticReport from './statistic/statistic-reports';
import DesktopDevices from './devices/desktop-devices';
import MobileDevices from './devices/mobile-devices';
import DeviceErrors from './devices/devices-errors';
import AbuseReports from './abuse-reports';
import Users from './users/users';
import AdminUsers from './users/admin-users';
@ -78,6 +81,8 @@ import UnhandledVirusFiles from './virus-scan/unhandled-virus-files';
import AdminOperationLogs from './admin-logs/operation-logs';
import AdminLoginLogs from './admin-logs/login-logs';
import AbuseReports from './abuse-reports';
import '../../css/layout.css';
import '../../css/toolbar.css';
@ -154,6 +159,14 @@ class SysAdmin extends React.Component {
this.setState({currentTab: currentTab});
}
componentWillMount() {
if (!Utils.isDesktop()) {
this.setState({
isSidePanelClosed: true
});
}
}
getCurrentTabForPageList = (pageList) => {
let urlPartList, tab;
const urlBase = `${siteRoot}sys/`;
@ -174,10 +187,22 @@ class SysAdmin extends React.Component {
tabItemClick = (param) => {
this.setState({currentTab: param});
if (!Utils.isDesktop() && !this.state.isSidePanelClosed) {
this.setState({ isSidePanelClosed: true });
}
}
toggleSidePanel = () => {
this.setState({
isSidePanelClosed: !this.state.isSidePanelClosed
});
}
render() {
let { currentTab, isSidePanelClosed } = this.state;
const { currentTab, isSidePanelClosed } = this.state;
const commonProps = {
toggleSidePanel: this.toggleSidePanel
};
return (
<div id="main">
@ -189,85 +214,75 @@ class SysAdmin extends React.Component {
/>
<MainPanel>
<Router className="reach-router">
<Info path={siteRoot + 'sys/info'} />
<StatisticFile path={siteRoot + 'sys/statistics/file'} />
<StatisticStorage path={siteRoot + 'sys/statistics/storage'} />
<StatisticUsers path={siteRoot + 'sys/statistics/user'} />
<StatisticTraffic path={siteRoot + 'sys/statistics/traffic'} />
<StatisticReport path={siteRoot + 'sys/statistics/reports'} />
<DesktopDevices path={siteRoot + 'sys/desktop-devices'} />
<MobileDevices path={siteRoot + 'sys/mobile-devices'} />
<DeviceErrors path={siteRoot + 'sys/device-errors'} />
<AllRepos path={siteRoot + 'sys/all-libraries'} />
<SystemRepo path={siteRoot + 'sys/system-library'} />
<TrashRepos path={siteRoot + 'sys/trash-libraries'} />
<SearchRepos path={siteRoot + 'sys/search-libraries'} />
<DirView path={siteRoot + 'sys/libraries/:repoID/*'} />
<WebSettings path={siteRoot + 'sys/web-settings'} />
<Notifications path={siteRoot + 'sys/notifications'} />
<Groups path={siteRoot + 'sys/groups'} />
<SearchGroups path={siteRoot + 'sys/search-groups'} />
<GroupRepos path={siteRoot + 'sys/groups/:groupID/libraries'} />
<GroupMembers path={siteRoot + 'sys/groups/:groupID/members'} />
<Info path={siteRoot + 'sys/info'} {...commonProps} />
<StatisticFile path={siteRoot + 'sys/statistics/file'} {...commonProps} />
<StatisticStorage path={siteRoot + 'sys/statistics/storage'} {...commonProps} />
<StatisticUsers path={siteRoot + 'sys/statistics/user'} {...commonProps} />
<StatisticTraffic path={siteRoot + 'sys/statistics/traffic'} {...commonProps} />
<StatisticReport path={siteRoot + 'sys/statistics/reports'} {...commonProps} />
<DesktopDevices path={siteRoot + 'sys/desktop-devices'} {...commonProps} />
<MobileDevices path={siteRoot + 'sys/mobile-devices'} {...commonProps} />
<DeviceErrors path={siteRoot + 'sys/device-errors'} {...commonProps} />
<AllRepos path={siteRoot + 'sys/all-libraries'} {...commonProps} />
<SystemRepo path={siteRoot + 'sys/system-library'} {...commonProps} />
<TrashRepos path={siteRoot + 'sys/trash-libraries'} {...commonProps} />
<SearchRepos path={siteRoot + 'sys/search-libraries'} {...commonProps} />
<DirView path={siteRoot + 'sys/libraries/:repoID/*'} {...commonProps} />
<WebSettings path={siteRoot + 'sys/web-settings'} {...commonProps} />
<Notifications path={siteRoot + 'sys/notifications'} {...commonProps} />
<Groups path={siteRoot + 'sys/groups'} {...commonProps} />
<SearchGroups path={siteRoot + 'sys/search-groups'} {...commonProps} />
<GroupRepos path={siteRoot + 'sys/groups/:groupID/libraries'} {...commonProps} />
<GroupMembers path={siteRoot + 'sys/groups/:groupID/members'} {...commonProps} />
<Departments path={siteRoot + 'sys/departments'}>
<DepartmentsList path='/'/>
<DepartmentDetail path='/:groupID'/>
<DepartmentsList path='/' {...commonProps} />
<DepartmentDetail path='/:groupID' {...commonProps} />
</Departments>
<ShareLinks path={siteRoot + 'sys/share-links'} />
<UploadLinks path={siteRoot + 'sys/upload-links'} />
<Orgs path={siteRoot + 'sys/organizations'} />
<SearchOrgs path={siteRoot + 'sys/search-organizations'} />
<OrgInfo path={siteRoot + 'sys/organizations/:orgID/info'} />
<OrgUsers path={siteRoot + 'sys/organizations/:orgID/users'} />
<OrgGroups path={siteRoot + 'sys/organizations/:orgID/groups'} />
<OrgRepos path={siteRoot + 'sys/organizations/:orgID/libraries'} />
<Institutions path={siteRoot + 'sys/institutions'} />
<InstitutionInfo path={siteRoot + 'sys/institutions/:institutionID/info'} />
<InstitutionUsers path={siteRoot + 'sys/institutions/:institutionID/members'} />
<InstitutionAdmins path={siteRoot + 'sys/institutions/:institutionID/admins'} />
<LoginLogs path={siteRoot + 'sys/logs/login'} />
<FileAccessLogs path={siteRoot + 'sys/logs/file-access'} />
<FileUpdateLogs path={siteRoot + 'sys/logs/file-update'} />
<SharePermissionLogs path={siteRoot + 'sys/logs/share-permission'} />
<AdminOperationLogs path={siteRoot + 'sys/admin-logs/operation'} />
<AdminLoginLogs path={siteRoot + 'sys/admin-logs/login'} />
<ShareLinks path={siteRoot + 'sys/share-links'} {...commonProps} />
<UploadLinks path={siteRoot + 'sys/upload-links'} {...commonProps} />
<Orgs path={siteRoot + 'sys/organizations'} {...commonProps} />
<SearchOrgs path={siteRoot + 'sys/search-organizations'} {...commonProps} />
<OrgInfo path={siteRoot + 'sys/organizations/:orgID/info'} {...commonProps} />
<OrgUsers path={siteRoot + 'sys/organizations/:orgID/users'} {...commonProps} />
<OrgGroups path={siteRoot + 'sys/organizations/:orgID/groups'} {...commonProps} />
<OrgRepos path={siteRoot + 'sys/organizations/:orgID/libraries'} {...commonProps} />
<Institutions path={siteRoot + 'sys/institutions'} {...commonProps} />
<InstitutionInfo path={siteRoot + 'sys/institutions/:institutionID/info'} {...commonProps} />
<InstitutionUsers path={siteRoot + 'sys/institutions/:institutionID/members'} {...commonProps} />
<InstitutionAdmins path={siteRoot + 'sys/institutions/:institutionID/admins'} {...commonProps} />
<LoginLogs path={siteRoot + 'sys/logs/login'} {...commonProps} />
<FileAccessLogs path={siteRoot + 'sys/logs/file-access'} {...commonProps} />
<FileUpdateLogs path={siteRoot + 'sys/logs/file-update'} {...commonProps} />
<SharePermissionLogs path={siteRoot + 'sys/logs/share-permission'} {...commonProps} />
<AdminOperationLogs path={siteRoot + 'sys/admin-logs/operation'} {...commonProps} />
<AdminLoginLogs path={siteRoot + 'sys/admin-logs/login'} {...commonProps} />
<Users path={siteRoot + 'sys/users'} />
<AdminUsers path={siteRoot + 'sys/users/admins'} />
<LDAPImportedUsers path={siteRoot + 'sys/users/ldap-imported'} />
<LDAPUsers path={siteRoot + 'sys/users/ldap'} />
<SearchUsers path={siteRoot + 'sys/search-users'} />
<User path={siteRoot + 'sys/users/:email'} />
<UserOwnedRepos path={siteRoot + 'sys/users/:email/owned-libraries'} />
<UserSharedRepos path={siteRoot + 'sys/users/:email/shared-libraries'} />
<UserLinks path={siteRoot + 'sys/users/:email/shared-links'} />
<UserGroups path={siteRoot + 'sys/users/:email/groups'} />
<Users path={siteRoot + 'sys/users'} {...commonProps} />
<AdminUsers path={siteRoot + 'sys/users/admins'} {...commonProps} />
<LDAPImportedUsers path={siteRoot + 'sys/users/ldap-imported'} {...commonProps} />
<LDAPUsers path={siteRoot + 'sys/users/ldap'} {...commonProps} />
<SearchUsers path={siteRoot + 'sys/search-users'} {...commonProps} />
<User path={siteRoot + 'sys/users/:email'} {...commonProps} />
<UserOwnedRepos path={siteRoot + 'sys/users/:email/owned-libraries'} {...commonProps} />
<UserSharedRepos path={siteRoot + 'sys/users/:email/shared-libraries'} {...commonProps} />
<UserLinks path={siteRoot + 'sys/users/:email/shared-links'} {...commonProps} />
<UserGroups path={siteRoot + 'sys/users/:email/groups'} {...commonProps} />
<Invitations path={siteRoot + 'sys/invitations'} />
<TermsAndConditions path={siteRoot + 'sys/terms-and-conditions/'} />
<Invitations path={siteRoot + 'sys/invitations'} {...commonProps} />
<TermsAndConditions path={siteRoot + 'sys/terms-and-conditions/'} {...commonProps} />
<AllVirusFiles path={siteRoot + 'sys/virus-files/all'} />
<UnhandledVirusFiles path={siteRoot + 'sys/virus-files/unhandled'} />
<AllVirusFiles path={siteRoot + 'sys/virus-files/all'} {...commonProps} />
<UnhandledVirusFiles path={siteRoot + 'sys/virus-files/unhandled'} {...commonProps} />
<FileScanRecords
path={siteRoot + 'sys/file-scan-records'}
currentTab={currentTab}
tabItemClick={this.tabItemClick}
/>
<WorkWeixinDepartments
path={siteRoot + 'sys/work-weixin'}
currentTab={currentTab}
tabItemClick={this.tabItemClick}
/>
<DingtalkDepartments
path={siteRoot + 'sys/dingtalk'}
currentTab={currentTab}
tabItemClick={this.tabItemClick}
/>
<AbuseReports path={siteRoot + 'sys/abuse-reports'} />
<FileScanRecords path={siteRoot + 'sys/file-scan-records'} {...commonProps} />
<WorkWeixinDepartments path={siteRoot + 'sys/work-weixin'} {...commonProps} />
<DingtalkDepartments path={siteRoot + 'sys/dingtalk'} {...commonProps} />
<AbuseReports path={siteRoot + 'sys/abuse-reports'} {...commonProps} />
</Router>
</MainPanel>
<MediaQuery query="(max-width: 767.8px)">
<Modal zIndex="1030" isOpen={!isSidePanelClosed} toggle={this.toggleSidePanel} contentClassName="d-none"></Modal>
</MediaQuery>
</div>
);
}

View File

@ -81,7 +81,7 @@ class Info extends Component {
return (
<Fragment>
<MainPanelTopbar />
<MainPanelTopbar {...this.props} />
<div className="main-panel-center flex-row">
<div className="cur-view-container system-admin-info">
<h2 className="heading">{gettext('Info')}</h2>

View File

@ -250,7 +250,7 @@ class InstitutionAdmins extends Component {
const { institutionName } = this.state;
return (
<Fragment>
<MainPanelTopbar />
<MainPanelTopbar {...this.props} />
<div className="main-panel-center flex-row">
<div className="cur-view-container">
<InstitutionNav

View File

@ -112,7 +112,7 @@ class InstitutionInfo extends Component {
const { institutionInfo } = this.state;
return (
<Fragment>
<MainPanelTopbar />
<MainPanelTopbar {...this.props} />
<div className="main-panel-center flex-row">
<div className="cur-view-container">
<InstitutionNav currentItem="info" institutionID={this.props.institutionID} institutionName={institutionInfo.name} />

View File

@ -333,7 +333,7 @@ class InstitutionUsers extends Component {
const { isAddUserDialogOpen, institutionName, hasNextPage, currentPage, perPage } = this.state;
return (
<Fragment>
<MainPanelTopbar>
<MainPanelTopbar {...this.props}>
<Button className="btn btn-secondary operation-item" onClick={this.toggleAddUserDialog}>{gettext('Add Member')}</Button>
</MainPanelTopbar>
<div className="main-panel-center flex-row">

View File

@ -215,7 +215,7 @@ class Institutions extends Component {
const { isAddInstitutionDialogOpen, hasNextPage, currentPage, perPage } = this.state;
return (
<Fragment>
<MainPanelTopbar>
<MainPanelTopbar {...this.props}>
<Button className="btn btn-secondary operation-item" onClick={this.toggleAddInstitutionDialog}>{gettext('Add Institution')}</Button>
</MainPanelTopbar>
<div className="main-panel-center flex-row">

View File

@ -299,7 +299,7 @@ class Invitations extends Component {
render() {
return (
<Fragment>
<MainPanelTopbar>
<MainPanelTopbar {...this.props}>
<Button className="btn btn-secondary operation-item" onClick={this.deleteItemInBatch}>{gettext('Delete Expired Invitations')}</Button>
</MainPanelTopbar>
<div className="main-panel-center flex-row">

View File

@ -242,7 +242,7 @@ class ShareLinks extends Component {
let { shareLinkList, currentPage, perPage, hasNextPage } = this.state;
return (
<Fragment>
<MainPanelTopbar />
<MainPanelTopbar {...this.props} />
<div className="main-panel-center flex-row">
<div className="cur-view-container">
<LinksNav currentItem="shareLinks" />

View File

@ -201,7 +201,7 @@ class UploadLinks extends Component {
let { uploadLinkList, currentPage, perPage, hasNextPage } = this.state;
return (
<Fragment>
<MainPanelTopbar />
<MainPanelTopbar {...this.props} />
<div className="main-panel-center flex-row">
<div className="cur-view-container">
<LinksNav currentItem="uploadLinks" />

View File

@ -300,7 +300,7 @@ class FileAccessLogs extends Component {
} = this.state;
return (
<Fragment>
<MainPanelTopbar>
<MainPanelTopbar {...this.props}>
<Button className="btn btn-secondary operation-item" onClick={this.toggleExportExcelDialog}>{gettext('Export Excel')}</Button>
</MainPanelTopbar>
<div className="main-panel-center flex-row">

View File

@ -201,7 +201,7 @@ class FileUpdateLogs extends Component {
let { logList, currentPage, perPage, hasNextPage, isExportExcelDialogOpen } = this.state;
return (
<Fragment>
<MainPanelTopbar>
<MainPanelTopbar {...this.props}>
<Button className="btn btn-secondary operation-item" onClick={this.toggleExportExcelDialog}>{gettext('Export Excel')}</Button>
</MainPanelTopbar>
<div className="main-panel-center flex-row">

View File

@ -169,7 +169,7 @@ class LoginLogs extends Component {
let { logList, currentPage, perPage, hasNextPage, isExportExcelDialogOpen } = this.state;
return (
<Fragment>
<MainPanelTopbar>
<MainPanelTopbar {...this.props}>
<Button className="btn btn-secondary operation-item" onClick={this.toggleExportExcelDialog}>{gettext('Export Excel')}</Button>
</MainPanelTopbar>
<div className="main-panel-center flex-row">

View File

@ -202,7 +202,7 @@ class SharePermissionLogs extends Component {
let { logList, currentPage, perPage, hasNextPage, isExportExcelDialogOpen } = this.state;
return (
<Fragment>
<MainPanelTopbar>
<MainPanelTopbar {...this.props}>
<Button className="btn btn-secondary operation-item" onClick={this.toggleExportExcelDialog}>{gettext('Export Excel')}</Button>
</MainPanelTopbar>
<div className="main-panel-center flex-row">

View File

@ -1,9 +1,11 @@
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import Account from '../../components/common/account';
import { gettext } from '../../utils/constants';
const propTypes = {
children: PropTypes.object
children: PropTypes.object,
toggleSidePanel: PropTypes.func
};
class MainPanelTopbar extends Component {
@ -12,7 +14,11 @@ class MainPanelTopbar extends Component {
return (
<div className={`main-panel-north ${this.props.children ? 'border-left-show' : ''}`}>
<div className="cur-view-toolbar">
<span className="sf2-icon-menu side-nav-toggle hidden-md-up d-md-none" title="Side Nav Menu"></span>
<span
className="sf2-icon-menu side-nav-toggle hidden-md-up d-md-none"
title={gettext("Side Nav Menu")}
onClick={this.props.toggleSidePanel}
></span>
<div className="operation">
{this.props.children}
</div>

View File

@ -271,7 +271,7 @@ class Notifications extends Component {
const { isAddNotificationDialogOpen } = this.state;
return (
<Fragment>
<MainPanelTopbar>
<MainPanelTopbar {...this.props}>
<Button className="btn btn-secondary operation-item" onClick={this.toggleAddNotificationDialog}>{gettext('Add new notification')}</Button>
</MainPanelTopbar>
<div className="main-panel-center flex-row">

View File

@ -169,7 +169,7 @@ class OrgGroups extends Component {
render() {
return (
<Fragment>
<MainPanelTopbar />
<MainPanelTopbar {...this.props} />
<div className="main-panel-center flex-row">
<div className="cur-view-container">
<OrgNav

View File

@ -180,7 +180,7 @@ class OrgInfo extends Component {
const { orgInfo } = this.state;
return (
<Fragment>
<MainPanelTopbar />
<MainPanelTopbar {...this.props} />
<div className="main-panel-center flex-row">
<div className="cur-view-container">
<OrgNav currentItem="info" orgID={this.props.orgID} orgName={orgInfo.org_name} />

View File

@ -175,7 +175,7 @@ class OrgRepos extends Component {
render() {
return (
<Fragment>
<MainPanelTopbar />
<MainPanelTopbar {...this.props} />
<div className="main-panel-center flex-row">
<div className="cur-view-container">
<OrgNav

View File

@ -347,7 +347,7 @@ class OrgUsers extends Component {
const { isAddUserDialogOpen, orgName } = this.state;
return (
<Fragment>
<MainPanelTopbar>
<MainPanelTopbar {...this.props}>
<Button className="btn btn-secondary operation-item" onClick={this.toggleAddUserDialog}>{gettext('Add Member')}</Button>
</MainPanelTopbar>
<div className="main-panel-center flex-row">

View File

@ -124,7 +124,7 @@ class Orgs extends Component {
const { isAddOrgDialogOpen } = this.state;
return (
<Fragment>
<MainPanelTopbar search={this.getSearch()}>
<MainPanelTopbar search={this.getSearch()} {...this.props}>
<Button className="btn btn-secondary operation-item" onClick={this.toggleAddOrgDialog}>{gettext('Add Organization')}</Button>
</MainPanelTopbar>
<div className="main-panel-center flex-row">

View File

@ -90,7 +90,7 @@ class SearchOrgs extends Component {
const { query, isSubmitBtnActive } = this.state;
return (
<Fragment>
<MainPanelTopbar />
<MainPanelTopbar {...this.props} />
<div className="main-panel-center flex-row">
<div className="cur-view-container">
<div className="cur-view-path">

View File

@ -127,7 +127,7 @@ class AllRepos extends Component {
let { isCreateRepoDialogOpen } = this.state;
return (
<Fragment>
<MainPanelTopbar search={this.getSearch()}>
<MainPanelTopbar search={this.getSearch()} {...this.props}>
<Button className="btn btn-secondary operation-item" onClick={this.toggleCreateRepoDialog}>
<i className="fas fa-plus-square text-secondary mr-1"></i>{gettext('New Library')}
</Button>

View File

@ -168,13 +168,13 @@ class DirView extends Component {
return (
<Fragment>
{isSystemRepo ?
<MainPanelTopbar>
<MainPanelTopbar {...this.props}>
<Fragment>
<input className="d-none" type="file" onChange={this.onFileInputChange} ref={this.fileInput} />
<Button className="operation-item" onClick={this.openFileInput}>{gettext('Upload')}</Button>
<Button className="operation-item" onClick={this.toggleNewFolderDialog}>{gettext('New Folder')}</Button>
</Fragment>
</MainPanelTopbar> : <MainPanelTopbar />
</MainPanelTopbar> : <MainPanelTopbar {...this.props} />
}
<div className="main-panel-center flex-row">
<div className="cur-view-container">

View File

@ -81,7 +81,7 @@ class SearchRepos extends Component {
const { name, isSubmitBtnActive } = this.state;
return (
<Fragment>
<MainPanelTopbar />
<MainPanelTopbar {...this.props} />
<div className="main-panel-center flex-row">
<div className="cur-view-container">
<div className="cur-view-path">

View File

@ -92,7 +92,7 @@ class SystemRepo extends Component {
render() {
return (
<Fragment>
<MainPanelTopbar/>
<MainPanelTopbar {...this.props} />
<div className="main-panel-center flex-row">
<div className="cur-view-container">
<ReposNav currentItem="system" />

View File

@ -373,10 +373,10 @@ class TrashRepos extends Component {
return (
<Fragment>
{this.state.repos.length ? (
<MainPanelTopbar>
<MainPanelTopbar {...this.props}>
<Button className="operation-item" onClick={this.toggleCleanTrashDialog}>{gettext('Clean')}</Button>
</MainPanelTopbar>
) : <MainPanelTopbar />
) : <MainPanelTopbar {...this.props} />
}
<div className="main-panel-center flex-row">
<div className="cur-view-container">

View File

@ -78,7 +78,7 @@ class StatisticFile extends React.Component {
return(
<Fragment>
<MainPanelTopbar />
<MainPanelTopbar {...this.props} />
<div className="cur-view-container">
<StatisticNav currentItem="fileStatistic" />
<div className="cur-view-content">

View File

@ -61,7 +61,7 @@ class StatisticReports extends React.Component {
let { errorMessage } = this.state;
return(
<Fragment>
<MainPanelTopbar />
<MainPanelTopbar {...this.props} />
<div className="cur-view-container">
<StatisticNav currentItem="reportsStatistic" />
<div className="cur-view-content">

View File

@ -54,7 +54,7 @@ class StatisticStorage extends React.Component {
let { labels, filesData, isLoading } = this.state;
return(
<Fragment>
<MainPanelTopbar />
<MainPanelTopbar {...this.props} />
<div className="cur-view-container">
<StatisticNav currentItem="storageStatistic" />
<div className="cur-view-content">

View File

@ -141,7 +141,7 @@ class StatisticTraffic extends React.Component {
return (
<Fragment>
<MainPanelTopbar />
<MainPanelTopbar {...this.props} />
<div className="cur-view-container">
<StatisticNav currentItem="trafficStatistic" />
<div className="cur-view-content">

View File

@ -54,7 +54,7 @@ class StatisticUsers extends React.Component {
let { labels, filesData, isLoading } = this.state;
return (
<Fragment>
<MainPanelTopbar />
<MainPanelTopbar {...this.props} />
<div className="cur-view-container">
<StatisticNav currentItem="usersStatistic" />
<div className="cur-view-content">

View File

@ -81,7 +81,7 @@ class TermsAndConditions extends Component {
let { termList, isAddTermDialogOpen } = this.state;
return (
<Fragment>
<MainPanelTopbar>
<MainPanelTopbar {...this.props}>
<Button className="btn btn-secondary operation-item" onClick={this.toggleAddTermDialog}>{gettext('Add')}</Button>
</MainPanelTopbar>
<div className="main-panel-center flex-row">

View File

@ -4,7 +4,7 @@ import Users from './users';
class AdminUsers extends Component {
render() {
return <Users isAdmin={true} />;
return <Users isAdmin={true} {...this.props} />;
}
}

View File

@ -4,7 +4,7 @@ import Users from './users';
class LDAPImportedUsers extends Component {
render() {
return <Users isLDAPImported={true} />;
return <Users isLDAPImported={true} {...this.props} />;
}
}

View File

@ -149,7 +149,7 @@ class Users extends Component {
render() {
return (
<Fragment>
<MainPanelTopbar />
<MainPanelTopbar {...this.props} />
<div className="main-panel-center flex-row">
<div className="cur-view-container">
<UsersNav currentItem="ldap" />

View File

@ -280,13 +280,13 @@ class SearchUsers extends Component {
return (
<Fragment>
{hasUserSelected ?
<MainPanelTopbar>
<MainPanelTopbar {...this.props}>
<Fragment>
<Button className="btn btn-secondary operation-item" onClick={this.toggleBatchSetQuotaDialog}>{gettext('Set Quota')}</Button>
<Button className="btn btn-secondary operation-item" onClick={this.toggleBatchDeleteUserDialog}>{gettext('Delete Users')}</Button>
</Fragment>
</MainPanelTopbar> :
<MainPanelTopbar />
<MainPanelTopbar {...this.props} />
}
<div className="main-panel-center flex-row">
<div className="cur-view-container">

View File

@ -177,7 +177,7 @@ class Groups extends Component {
render() {
return (
<Fragment>
<MainPanelTopbar />
<MainPanelTopbar {...this.props} />
<div className="main-panel-center flex-row">
<div className="cur-view-container">
<Nav currentItem="groups" email={this.props.email} userName={this.state.userInfo.name} />

View File

@ -299,7 +299,7 @@ class User extends Component {
const { userInfo } = this.state;
return (
<Fragment>
<MainPanelTopbar />
<MainPanelTopbar {...this.props} />
<div className="main-panel-center flex-row">
<div className="cur-view-container">
<Nav currentItem="info" email={this.props.email} userName={userInfo.name} />

View File

@ -303,7 +303,7 @@ class Links extends Component {
const { shareLinkItems, uploadLinkItems } = this.state;
return (
<Fragment>
<MainPanelTopbar />
<MainPanelTopbar {...this.props} />
<div className="main-panel-center flex-row">
<div className="cur-view-container">
<Nav currentItem="links" email={this.props.email} userName={this.state.userInfo.name} />

View File

@ -284,7 +284,7 @@ class Repos extends Component {
render() {
return (
<Fragment>
<MainPanelTopbar />
<MainPanelTopbar {...this.props} />
<div className="main-panel-center flex-row">
<div className="cur-view-container">
<Nav currentItem="owned-repos" email={this.props.email} userName={this.state.userInfo.name} />

View File

@ -144,7 +144,7 @@ class Repos extends Component {
render() {
return (
<Fragment>
<MainPanelTopbar />
<MainPanelTopbar {...this.props} />
<div className="main-panel-center flex-row">
<div className="cur-view-container">
<Nav currentItem="shared-repos" email={this.props.email} userName={this.state.userInfo.name} />

View File

@ -441,7 +441,7 @@ class Users extends Component {
} = this.state;
return (
<Fragment>
<MainPanelTopbar search={this.getSearch()}>
<MainPanelTopbar search={this.getSearch()} {...this.props}>
{hasUserSelected ?
<Fragment>
<Button className="btn btn-secondary operation-item" onClick={this.toggleBatchSetQuotaDialog}>{gettext('Set Quota')}</Button>

View File

@ -286,7 +286,7 @@ class AllVirusFiles extends Component {
render() {
return (
<Fragment>
<MainPanelTopbar />
<MainPanelTopbar {...this.props} />
<div className="main-panel-center">
<div className="cur-view-container">
<Nav currentItem="all" />

View File

@ -384,13 +384,13 @@ class UnhandledVirusFiles extends Component {
return (
<Fragment>
{this.state.virusFiles.some(item => item.isSelected) ? (
<MainPanelTopbar>
<MainPanelTopbar {...this.props}>
<Fragment>
<Button onClick={this.deleteSelectedItems} className="operation-item">{gettext('Delete')}</Button>
<Button onClick={this.ignoreSelectedItems} className="operation-item">{gettext('Ignore')}</Button>
</Fragment>
</MainPanelTopbar>
) : <MainPanelTopbar />
) : <MainPanelTopbar {...this.props} />
}
<div className="main-panel-center">
<div className="cur-view-container">

View File

@ -86,7 +86,7 @@ class WebSettings extends Component {
const { loading, errorMsg, config_dict, logoPath, faviconPath, loginBGPath } = this.state;
return (
<Fragment>
<MainPanelTopbar />
<MainPanelTopbar {...this.props} />
<div className="main-panel-center flex-row">
<div className="cur-view-container">
<div className="cur-view-path">

View File

@ -5,7 +5,7 @@ import { seafileAPI } from '../../utils/seafile-api';
import { gettext, siteRoot, isPro } from '../../utils/constants';
import { Utils } from '../../utils/utils';
import toaster from '../../components/toast';
import Account from '../../components/common/account';
import MainPanelTopbar from './main-panel-topbar';
import { WorkWeixinDepartmentMembersList, WorkWeixinDepartmentsTreePanel } from './work-weixin';
import ImportWorkWeixinDepartmentDialog from '../../components/dialog/import-work-weixin-department-dialog';
@ -289,28 +289,14 @@ class WorkWeixinDepartments extends Component {
this.getWorkWeixinDepartmentsList(null);
}
renderNav() {
const btnClass = 'btn btn-secondary operation-item ';
return (
<div className="main-panel-north border-left-show">
<div className="cur-view-toolbar">
<span className="sf2-icon-menu side-nav-toggle hidden-md-up d-md-none" title="Side Nav Menu"></span>
<Button className={btnClass + 'my-1 d-md-none'} onClick={this.onSubmit}>{'导入用户'}</Button>
<Button className={btnClass + 'hidden-md-up'} onClick={this.onSubmit}>{'导入用户'}</Button>
</div>
<div className="common-toolbar">
<Account isAdminPanel={true}/>
</div>
</div>
);
}
render() {
const { isImportDepartmentDialogShow, isTreeLoading, importDepartment, importDepartmentChildrenCount, importDepartmentMembersCount } = this.state;
let canImportDepartment = !!(isPro && isImportDepartmentDialogShow && !isTreeLoading && importDepartment);
return (
<Fragment>
{this.renderNav()}
<MainPanelTopbar {...this.props}>
<Button className="operation-item" onClick={this.onSubmit}>{'导入用户'}</Button>
</MainPanelTopbar>
<div className="main-panel-center">
<div className="cur-view-container">
<div className="cur-view-path">