1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-09-13 13:50:07 +00:00

conflict fixed

This commit is contained in:
shanshuirenjia
2020-04-01 11:19:09 +08:00
25 changed files with 369 additions and 76 deletions

View File

@@ -0,0 +1,10 @@
import React from 'react';
import { siteRoot, gettext } from '../../utils/constants';
export default function Logout() {
return (
<a className="logout-icon" href={`${siteRoot}accounts/logout/`} title={gettext('Log out')}>
<i className="sf3-font sf3-font-logout" style={{fontSize: '24px'}}></i>
</a>
);
}

View File

@@ -1,7 +1,7 @@
import React from 'react';
import PropTypes from 'prop-types';
import { Modal, ModalBody } from 'reactstrap';
import { gettext, lang, mediaUrl, logoPath, logoWidth, logoHeight, siteTitle, seafileVersion } from '../../utils/constants';
import { gettext, lang, mediaUrl, logoPath, logoWidth, logoHeight, siteTitle, seafileVersion, extraAboutDialogLinks } from '../../utils/constants';
const propTypes = {
onCloseAboutDialog: PropTypes.func.isRequired,
@@ -13,6 +13,16 @@ class AboutDialog extends React.Component {
this.props.onCloseAboutDialog();
}
renderExternalAboutLinks = () => {
if (extraAboutDialogLinks && (typeof extraAboutDialogLinks) === 'object') {
let keys = Object.keys(extraAboutDialogLinks);
return keys.map((key, index) => {
return <a key={index} className="d-block" href={extraAboutDialogLinks[key]}>{key}</a>;
});
}
return null;
}
render() {
let href = lang === lang == 'zh-cn' ? 'http://seafile.com/about/' : 'http://seafile.com/en/about/';
@@ -23,6 +33,7 @@ class AboutDialog extends React.Component {
<div className="about-content">
<p><img src={mediaUrl + logoPath} height={logoHeight} width={logoWidth} title={siteTitle} alt="logo" /></p>
<p>{gettext('Server Version: ')}{seafileVersion}<br />© 2019 {gettext('Seafile')}</p>
<p>{this.renderExternalAboutLinks()}</p>
<p><a href={href} target="_blank">{gettext('About Us')}</a></p>
</div>
</ModalBody>

View File

@@ -23,7 +23,7 @@ class CopyMoveDirentProgressDialog extends React.Component {
textAlign: 'left',
};
return (
<Modal isOpen={true} toggle={this.props.toggleDialog}>
<Modal isOpen={true}>
<ModalHeader toggle={this.props.toggleDialog}>{title}</ModalHeader>
<ModalBody style={{minHeight: '80px'}}>
<div className="progress" style={{height: '40px'}}>

View File

@@ -1,7 +1,7 @@
import React, { Fragment } from 'react';
import PropTypes from 'prop-types';
import { Modal, ModalHeader, ModalBody, TabContent, TabPane, Nav, NavItem, NavLink } from 'reactstrap';
import { gettext, username, canGenerateShareLink, canGenerateUploadLink, canInvitePeople } from '../../utils/constants';
import { Modal, ModalHeader, ModalBody, TabContent, TabPane, Nav, NavItem, NavLink } from 'reactstrap';
import { gettext, username, canGenerateShareLink, canGenerateUploadLink, canInvitePeople, extraShareDialogNote } from '../../utils/constants';
import ShareToUser from './share-to-user';
import ShareToGroup from './share-to-group';
import ShareToInvitePeople from './share-to-invite-people';
@@ -226,13 +226,28 @@ class ShareDialog extends React.Component {
);
}
renderExternalShareMessage = () => {
if (extraShareDialogNote && (typeof extraShareDialogNote) === 'object') {
return (
<div className="external-share-message mt-2">
<h6>{extraShareDialogNote.title}</h6>
<div style={{fontSize: '14px', color: '#666'}}>{extraShareDialogNote.content}</div>
</div>
);
}
return null;
}
render() {
const { itemType, itemName, repoEncrypted } = this.props;
const enableShareLink = !repoEncrypted && canGenerateShareLink;
return (
<div>
<Modal isOpen={true} style={{ maxWidth: '720px' }} className="share-dialog" toggle={this.props.toggleDialog}>
<ModalHeader toggle={this.props.toggleDialog}>{gettext('Share')} <span className="op-target" title={itemName}>{itemName}</span></ModalHeader>
<Modal isOpen={true} style={{maxWidth: '720px'}} className="share-dialog" toggle={this.props.toggleDialog}>
<ModalHeader toggle={this.props.toggleDialog}>
{gettext('Share')} <span className="op-target" title={itemName}>{itemName}</span>
{this.renderExternalShareMessage()}
</ModalHeader>
<ModalBody className="share-dialog-content">
{(itemType === 'library' || itemType === 'dir') && this.renderDirContent()}
{(itemType === 'file' && enableShareLink) && this.renderFileContent()}

View File

@@ -279,8 +279,8 @@ class ShareToGroup extends React.Component {
let sharedItemGroupID = sharedItem.group_info.id;
if (groupID === sharedItemGroupID) {
sharedItem.permission = permission;
sharedItem.is_admin = permission === 'admin' ? true : false;
}
sharedItem.is_admin = permission === 'admin' ? true : false;
return sharedItem;
});
this.setState({sharedItems: sharedItems});

View File

@@ -263,8 +263,8 @@ class ShareToUser extends React.Component {
let sharedItemUsername = sharedItem.user_info.name;
if (username === sharedItemUsername) {
sharedItem.permission = permission;
sharedItem.is_admin = permission === 'admin' ? true : false;
}
sharedItem.is_admin = permission === 'admin' ? true : false;
return sharedItem;
});
this.setState({sharedItems: sharedItems});

View File

@@ -94,29 +94,52 @@ class Search extends Component {
sendRequest(queryData, cancelToken) {
var _this = this;
let isPublic = this.props.isPublic;
seafileAPI.searchFiles(queryData, cancelToken).then(res => {
if (!res.data.total) {
if (isPublic) {
seafileAPI.searchFilesInPublishedRepo(queryData.search_repo, queryData.q).then(res => {
if (!res.data.total) {
_this.setState({
resultItems: [],
isResultGetted: true
});
_this.source = null;
return;
}
let items = _this.formatResultItems(res.data.results);
_this.setState({
resultItems: [],
resultItems: items,
isResultGetted: true
});
_this.source = null;
return;
}
let items = _this.formatResultItems(res.data.results);
_this.setState({
total: res.data.total,
resultItems: items,
isResultGetted: true
}).catch(error => {
let errMessage = Utils.getErrorMsg(error);
toaster.danger(errMessage);
});
_this.source = null;
}).catch(res => {
/* eslint-disable */
} else {
editorUtilities.searchFiles(queryData,cancelToken).then(res => {
if (!res.data.total) {
_this.setState({
resultItems: [],
isResultGetted: true
});
_this.source = null;
return;
}
let items = _this.formatResultItems(res.data.results);
_this.setState({
resultItems: items,
isResultGetted: true
});
_this.source = null;
}).catch(res => {
/* eslint-disable */
console.log(res);
/* eslint-enable */
});
});
}
}
cancelRequest() {

View File

@@ -2,7 +2,7 @@ import React from 'react';
import PropTypes from 'prop-types';
import { gettext } from '../../utils/constants';
const { err, trafficOverLimit, zipped, filePath } = window.shared.pageOptions;
const { err, trafficOverLimit, zipped, filePath, canDownload } = window.shared.pageOptions;
const propTypes = {
errorMsg: PropTypes.string
@@ -16,11 +16,14 @@ class SharedFileViewTip extends React.Component {
} else {
errorMsg = <p className="error">{err || this.props.errorMsg}</p>;
}
let isShowDownloadBtn = canDownload && !trafficOverLimit;
return (
<div className="shared-file-view-body">
<div className="file-view-tip">
<div className={`file-view-tip ${!isShowDownloadBtn ? 'pt-7' : ''}`}>
{errorMsg}
{!trafficOverLimit &&
{isShowDownloadBtn &&
<a href={`?${zipped ? 'p=' + encodeURIComponent(filePath) + '&' : ''}dl=1`} className="btn btn-secondary">{gettext('Download')}</a>
}
</div>

View File

@@ -1,5 +1,5 @@
import React from 'react';
import { gettext, siteRoot } from '../utils/constants';
import React, { Fragment } from 'react';
import { gettext, siteRoot, sideNavFooterCustomHtml, extraAppBottomLinks } from '../utils/constants';
import ModalPortal from './modal-portal';
import AboutDialog from './dialog/about-dialog';
@@ -16,21 +16,38 @@ class SideNavFooter extends React.Component {
this.setState({isAboutDialogShow: !this.state.isAboutDialogShow});
}
renderExternalAppLinks = () => {
if (extraAppBottomLinks && (typeof extraAppBottomLinks) === 'object') {
let keys = Object.keys(extraAppBottomLinks);
return keys.map((key, index) => {
return <a key={index} className="item" href={extraAppBottomLinks[key]}>{key}</a>;
});
}
return null;
}
render() {
if (sideNavFooterCustomHtml) {
return (<div className='side-nav-footer' dangerouslySetInnerHTML={{__html: sideNavFooterCustomHtml}}></div>);
}
return (
<div className="side-nav-footer">
<a href={siteRoot + 'help/'} target="_blank" rel="noopener noreferrer" className="item">{gettext('Help')}</a>
<a className="item cursor-pointer" onClick={this.onAboutDialogToggle}>{gettext('About')}</a>
<a href={siteRoot + 'download_client_program/'} className="item last-item">
<span aria-hidden="true" className="sf2-icon-monitor vam"></span>{' '}
<span className="vam">{gettext('Clients')}</span>
</a>
{this.state.isAboutDialogShow &&
<Fragment>
<div className="side-nav-footer flex-wrap">
<a href={siteRoot + 'help/'} target="_blank" rel="noopener noreferrer" className="item">{gettext('Help')}</a>
<a className="item cursor-pointer" onClick={this.onAboutDialogToggle}>{gettext('About')}</a>
{this.renderExternalAppLinks()}
<a href={siteRoot + 'download_client_program/'} className={`item ${extraAppBottomLinks ? '' : 'last-item'}`}>
<span aria-hidden="true" className="sf2-icon-monitor vam"></span>{' '}
<span className="vam">{gettext('Clients')}</span>
</a>
</div>
{this.state.isAboutDialogShow && (
<ModalPortal>
<AboutDialog onCloseAboutDialog={this.onAboutDialogToggle} />
</ModalPortal>
}
</div>
)}
</Fragment>
);
}
}

View File

@@ -1,9 +1,10 @@
import React from 'react';
import PropTypes from 'prop-types';
import { isPro, gettext } from '../../utils/constants';
import { isPro, gettext, showLogoutIcon } from '../../utils/constants';
import Search from '../search/search';
import Notification from '../common/notification';
import Account from '../common/account';
import Logout from '../common/logout';
const propTypes = {
repoID: PropTypes.string,
@@ -25,6 +26,7 @@ class CommonToolbar extends React.Component {
)}
<Notification />
<Account />
{showLogoutIcon && (<Logout />)}
</div>
);
}