mirror of
https://github.com/haiwen/seahub.git
synced 2025-09-03 16:10:26 +00:00
[dir view] redesigned the toolbar for the current folder (#6117)
* [dir view] redesigned the toolbar for the current folder * [dir view] toolbar for the current folder: code cleanup * [dir view] toolbar for the current folder: updated the 'upload' icon; modified UI details
This commit is contained in:
@@ -5,6 +5,7 @@ import { UncontrolledTooltip } from 'reactstrap';
|
|||||||
import { siteRoot, gettext } from '../../utils/constants';
|
import { siteRoot, gettext } from '../../utils/constants';
|
||||||
import { Utils } from '../../utils/utils';
|
import { Utils } from '../../utils/utils';
|
||||||
import { InternalLinkOperation } from '../operations';
|
import { InternalLinkOperation } from '../operations';
|
||||||
|
import DirOperationToolBar from '../../components/toolbar/dir-operation-toolbar';
|
||||||
|
|
||||||
const propTypes = {
|
const propTypes = {
|
||||||
repoName: PropTypes.string.isRequired,
|
repoName: PropTypes.string.isRequired,
|
||||||
@@ -50,7 +51,23 @@ class DirPath extends React.Component {
|
|||||||
return (
|
return (
|
||||||
<Fragment key={index}>
|
<Fragment key={index}>
|
||||||
<span className="path-split">/</span>
|
<span className="path-split">/</span>
|
||||||
<span className="path-file-name">{item}</span>
|
<DirOperationToolBar
|
||||||
|
path={this.props.currentPath}
|
||||||
|
repoID={this.props.repoID}
|
||||||
|
repoName={this.props.repoName}
|
||||||
|
repoEncrypted={this.props.repoEncrypted}
|
||||||
|
direntList={this.props.direntList}
|
||||||
|
showShareBtn={this.props.showShareBtn}
|
||||||
|
enableDirPrivateShare={this.props.enableDirPrivateShare}
|
||||||
|
userPerm={this.props.userPerm}
|
||||||
|
isGroupOwnedRepo={this.props.isGroupOwnedRepo}
|
||||||
|
onAddFile={this.props.onAddFile}
|
||||||
|
onAddFolder={this.props.onAddFolder}
|
||||||
|
onUploadFile={this.props.onUploadFile}
|
||||||
|
onUploadFolder={this.props.onUploadFolder}
|
||||||
|
>
|
||||||
|
<span className="path-file-name">{item}</span>
|
||||||
|
</DirOperationToolBar>
|
||||||
</Fragment>
|
</Fragment>
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
@@ -58,7 +75,7 @@ class DirPath extends React.Component {
|
|||||||
return (
|
return (
|
||||||
<Fragment key={index} >
|
<Fragment key={index} >
|
||||||
<span className="path-split">/</span>
|
<span className="path-split">/</span>
|
||||||
<a className="path-link" data-path={nodePath} onClick={this.onPathClick}>{item}</a>
|
<a className="path-link path-item" data-path={nodePath} onClick={this.onPathClick}>{item}</a>
|
||||||
</Fragment>
|
</Fragment>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -78,31 +95,47 @@ class DirPath extends React.Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="path-container">
|
<div className="path-container dir-view-path">
|
||||||
<button className="op-btn mr-2" onClick={this.props.toggleTreePanel}><span className="sf3-font-side-bar sf3-font"></span></button>
|
<button className="op-btn mr-2" onClick={this.props.toggleTreePanel}><span className="sf3-font-side-bar sf3-font"></span></button>
|
||||||
{this.props.pathPrefix && this.props.pathPrefix.map((item, index) => {
|
{this.props.pathPrefix && this.props.pathPrefix.map((item, index) => {
|
||||||
return (
|
return (
|
||||||
<Fragment key={index}>
|
<Fragment key={index}>
|
||||||
<Link to={item.url} className="normal" onClick={(e) => this.onTabNavClick(e, item.name, item.id)}>{gettext(item.showName)}</Link>
|
<Link to={item.url} className="path-item normal" onClick={(e) => this.onTabNavClick(e, item.name, item.id)}>{gettext(item.showName)}</Link>
|
||||||
<span className="path-split">/</span>
|
<span className="path-split">/</span>
|
||||||
</Fragment>
|
</Fragment>
|
||||||
);
|
);
|
||||||
})}
|
})}
|
||||||
{this.props.pathPrefix && this.props.pathPrefix.length === 0 && (
|
{this.props.pathPrefix && this.props.pathPrefix.length === 0 && (
|
||||||
<Fragment>
|
<Fragment>
|
||||||
<Link to={siteRoot + 'libraries/'} className="normal" onClick={(e) => this.onTabNavClick(e, 'libraries')}>{gettext('Files')}</Link>
|
<Link to={siteRoot + 'libraries/'} className="path-item normal" onClick={(e) => this.onTabNavClick(e, 'libraries')}>{gettext('Files')}</Link>
|
||||||
<span className="path-split">/</span>
|
<span className="path-split">/</span>
|
||||||
</Fragment>
|
</Fragment>
|
||||||
)}
|
)}
|
||||||
{!this.props.pathPrefix && (
|
{!this.props.pathPrefix && (
|
||||||
<Fragment>
|
<Fragment>
|
||||||
<Link to={siteRoot + 'libraries/'} className="normal" onClick={(e) => this.onTabNavClick(e, 'libraries')}>{gettext('Files')}</Link>
|
<Link to={siteRoot + 'libraries/'} className="path-item normal" onClick={(e) => this.onTabNavClick(e, 'libraries')}>{gettext('Files')}</Link>
|
||||||
<span className="path-split">/</span>
|
<span className="path-split">/</span>
|
||||||
</Fragment>
|
</Fragment>
|
||||||
)}
|
)}
|
||||||
{(currentPath === '/' || currentPath === '') ?
|
{(currentPath === '/' || currentPath === '') ?
|
||||||
<span className="path-repo-name">{repoName}</span>:
|
<DirOperationToolBar
|
||||||
<a className="path-link" data-path="/" onClick={this.onPathClick}>{repoName}</a>
|
path={this.props.currentPath}
|
||||||
|
repoID={this.props.repoID}
|
||||||
|
repoName={this.props.repoName}
|
||||||
|
repoEncrypted={this.props.repoEncrypted}
|
||||||
|
direntList={this.props.direntList}
|
||||||
|
showShareBtn={this.props.showShareBtn}
|
||||||
|
enableDirPrivateShare={this.props.enableDirPrivateShare}
|
||||||
|
userPerm={this.props.userPerm}
|
||||||
|
isGroupOwnedRepo={this.props.isGroupOwnedRepo}
|
||||||
|
onAddFile={this.props.onAddFile}
|
||||||
|
onAddFolder={this.props.onAddFolder}
|
||||||
|
onUploadFile={this.props.onUploadFile}
|
||||||
|
onUploadFolder={this.props.onUploadFolder}
|
||||||
|
>
|
||||||
|
<span className="path-repo-name">{repoName}</span>
|
||||||
|
</DirOperationToolBar> :
|
||||||
|
<a className="path-item" data-path="/" onClick={this.onPathClick}>{repoName}</a>
|
||||||
}
|
}
|
||||||
{pathElem}
|
{pathElem}
|
||||||
{this.props.isViewFile && (
|
{this.props.isViewFile && (
|
||||||
|
@@ -47,15 +47,25 @@ class CurDirPath extends React.Component {
|
|||||||
return (
|
return (
|
||||||
<Fragment>
|
<Fragment>
|
||||||
<DirPath
|
<DirPath
|
||||||
|
repoID={this.props.repoID}
|
||||||
repoName={this.props.repoName}
|
repoName={this.props.repoName}
|
||||||
|
repoEncrypted={this.props.repoEncrypted}
|
||||||
|
isGroupOwnedRepo={this.props.isGroupOwnedRepo}
|
||||||
pathPrefix={this.props.pathPrefix}
|
pathPrefix={this.props.pathPrefix}
|
||||||
currentPath={this.props.currentPath}
|
currentPath={this.props.currentPath}
|
||||||
|
userPerm={this.props.userPerm}
|
||||||
onPathClick={this.props.onPathClick}
|
onPathClick={this.props.onPathClick}
|
||||||
onTabNavClick={this.props.onTabNavClick}
|
onTabNavClick={this.props.onTabNavClick}
|
||||||
repoID={this.props.repoID}
|
|
||||||
isViewFile={this.props.isViewFile}
|
isViewFile={this.props.isViewFile}
|
||||||
fileTags={this.props.fileTags}
|
fileTags={this.props.fileTags}
|
||||||
toggleTreePanel={this.props.toggleTreePanel}
|
toggleTreePanel={this.props.toggleTreePanel}
|
||||||
|
enableDirPrivateShare={this.props.enableDirPrivateShare}
|
||||||
|
showShareBtn={this.props.showShareBtn}
|
||||||
|
onAddFolder={this.props.onAddFolder}
|
||||||
|
onAddFile={this.props.onAddFile}
|
||||||
|
onUploadFile={this.props.onUploadFile}
|
||||||
|
onUploadFolder={this.props.onUploadFolder}
|
||||||
|
direntList={this.props.fullDirentList}
|
||||||
/>
|
/>
|
||||||
{isDesktop &&
|
{isDesktop &&
|
||||||
<DirTool
|
<DirTool
|
||||||
|
@@ -22,8 +22,7 @@ const propTypes = {
|
|||||||
onUploadFile: PropTypes.func.isRequired,
|
onUploadFile: PropTypes.func.isRequired,
|
||||||
onUploadFolder: PropTypes.func.isRequired,
|
onUploadFolder: PropTypes.func.isRequired,
|
||||||
direntList: PropTypes.array.isRequired,
|
direntList: PropTypes.array.isRequired,
|
||||||
currentMode: PropTypes.string.isRequired,
|
children: PropTypes.object
|
||||||
switchViewMode: PropTypes.func.isRequired,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class DirOperationToolbar extends React.Component {
|
class DirOperationToolbar extends React.Component {
|
||||||
@@ -34,68 +33,29 @@ class DirOperationToolbar extends React.Component {
|
|||||||
fileType: '.md',
|
fileType: '.md',
|
||||||
isCreateFileDialogShow: false,
|
isCreateFileDialogShow: false,
|
||||||
isCreateFolderDialogShow: false,
|
isCreateFolderDialogShow: false,
|
||||||
isUploadMenuShow: false,
|
|
||||||
isCreateMenuShow: false,
|
|
||||||
isShareDialogShow: false,
|
isShareDialogShow: false,
|
||||||
operationMenuStyle: '',
|
operationMenuStyle: '',
|
||||||
|
isDesktopMenuOpen: false,
|
||||||
isMobileOpMenuOpen: false
|
isMobileOpMenuOpen: false
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
componentDidMount() {
|
toggleDesktopOpMenu = () => {
|
||||||
document.addEventListener('click', this.hideOperationMenu);
|
this.setState({isDesktopMenuOpen: !this.state.isDesktopMenuOpen});
|
||||||
}
|
};
|
||||||
|
|
||||||
componentWillUnmount() {
|
|
||||||
document.removeEventListener('click', this.hideOperationMenu);
|
|
||||||
}
|
|
||||||
|
|
||||||
toggleMobileOpMenu = () => {
|
toggleMobileOpMenu = () => {
|
||||||
this.setState({isMobileOpMenuOpen: !this.state.isMobileOpMenuOpen});
|
this.setState({isMobileOpMenuOpen: !this.state.isMobileOpMenuOpen});
|
||||||
};
|
};
|
||||||
|
|
||||||
hideOperationMenu = () => {
|
|
||||||
this.setState({
|
|
||||||
isUploadMenuShow: false,
|
|
||||||
isCreateMenuShow: false,
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
toggleOperationMenu = (e) => {
|
|
||||||
e.nativeEvent.stopImmediatePropagation();
|
|
||||||
let targetRect = e.target.getBoundingClientRect();
|
|
||||||
let left = targetRect.left;
|
|
||||||
let top = targetRect.bottom;
|
|
||||||
let style = {position: 'fixed', display: 'block', left: left, top: top};
|
|
||||||
this.setState({operationMenuStyle: style});
|
|
||||||
};
|
|
||||||
|
|
||||||
onUploadClick = (e) => {
|
|
||||||
this.toggleOperationMenu(e);
|
|
||||||
this.setState({
|
|
||||||
isUploadMenuShow: !this.state.isUploadMenuShow,
|
|
||||||
isCreateMenuShow: false,
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
onUploadFile = (e) => {
|
onUploadFile = (e) => {
|
||||||
this.setState({isUploadMenuShow: false});
|
|
||||||
this.props.onUploadFile(e);
|
this.props.onUploadFile(e);
|
||||||
};
|
};
|
||||||
|
|
||||||
onUploadFolder = (e) => {
|
onUploadFolder = (e) => {
|
||||||
this.setState({isUploadMenuShow: false});
|
|
||||||
this.props.onUploadFolder(e);
|
this.props.onUploadFolder(e);
|
||||||
};
|
};
|
||||||
|
|
||||||
onCreateClick = (e) => {
|
|
||||||
this.toggleOperationMenu(e);
|
|
||||||
this.setState({
|
|
||||||
isCreateMenuShow: !this.state.isCreateMenuShow,
|
|
||||||
isUploadMenuShow: false,
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
onShareClick = () => {
|
onShareClick = () => {
|
||||||
this.setState({
|
this.setState({
|
||||||
isShareDialogShow: !this.state.isShareDialogShow
|
isShareDialogShow: !this.state.isShareDialogShow
|
||||||
@@ -161,6 +121,41 @@ class DirOperationToolbar extends React.Component {
|
|||||||
return isDuplicated;
|
return isDuplicated;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
onDropdownToggleKeyDown = (e) => {
|
||||||
|
if (e.key == 'Enter' || e.key == 'Space') {
|
||||||
|
this.toggleDesktopOpMenu();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
onDropDownMouseMove = (e) => {
|
||||||
|
if (this.state.isSubMenuShown && e.target && e.target.className === 'dropdown-item') {
|
||||||
|
this.setState({
|
||||||
|
isSubMenuShown: false
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
toggleSubMenu = (e) => {
|
||||||
|
e.stopPropagation();
|
||||||
|
this.setState({
|
||||||
|
isSubMenuShown: !this.state.isSubMenuShown}, () => {
|
||||||
|
this.toggleDesktopOpMenu();
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
toggleSubMenuShown = (item) => {
|
||||||
|
this.setState({
|
||||||
|
isSubMenuShown: true,
|
||||||
|
currentItem: item.text
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
onMenuItemKeyDown = (item, e) => {
|
||||||
|
if (e.key == 'Enter' || e.key == 'Space') {
|
||||||
|
item.onClick();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
let { path, repoName, userPerm } = this.props;
|
let { path, repoName, userPerm } = this.props;
|
||||||
|
|
||||||
@@ -179,42 +174,108 @@ class DirOperationToolbar extends React.Component {
|
|||||||
let content = null;
|
let content = null;
|
||||||
if (Utils.isDesktop()) {
|
if (Utils.isDesktop()) {
|
||||||
const { showShareBtn, repoEncrypted } = this.props;
|
const { showShareBtn, repoEncrypted } = this.props;
|
||||||
|
let opList = [];
|
||||||
|
if (canUpload) {
|
||||||
|
if (Utils.isSupportUploadFolder()) {
|
||||||
|
opList.push({
|
||||||
|
'icon': 'upload-files',
|
||||||
|
'text': gettext('Upload'),
|
||||||
|
subOpList: [
|
||||||
|
{'text': gettext('Upload Files'), 'onClick': this.onUploadFile},
|
||||||
|
{'text': gettext('Upload Folder'), 'onClick': this.onUploadFolder}
|
||||||
|
]
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
opList.push({'text': gettext('Upload'), 'onClick': this.onUploadFile});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (canCreate) {
|
||||||
|
let newSubOpList = [
|
||||||
|
{'text': gettext('New Folder'), 'onClick': this.onCreateFolderToggle},
|
||||||
|
{'text': gettext('New File'), 'onClick': this.onCreateFileToggle},
|
||||||
|
'Divider',
|
||||||
|
{'text': gettext('New Markdown File'), 'onClick': this.onCreateMarkdownToggle},
|
||||||
|
{'text': gettext('New Excel File'), 'onClick': this.onCreateExcelToggle},
|
||||||
|
{'text': gettext('New PowerPoint File'), 'onClick': this.onCreatePPTToggle},
|
||||||
|
{'text': gettext('New Word File'), 'onClick': this.onCreateWordToggle}
|
||||||
|
];
|
||||||
|
if (enableSeadoc && !repoEncrypted) {
|
||||||
|
newSubOpList.push({'text': gettext('New SeaDoc File'), 'onClick': this.onCreateSeaDocToggle});
|
||||||
|
}
|
||||||
|
opList.push({
|
||||||
|
'icon': 'new',
|
||||||
|
'text': gettext('New'),
|
||||||
|
subOpList: newSubOpList
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (showShareBtn) {
|
||||||
|
opList.push({
|
||||||
|
'icon': 'share',
|
||||||
|
'text': gettext('Share'),
|
||||||
|
'onClick': this.onShareClick
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
content = (
|
content = (
|
||||||
<Fragment>
|
<Fragment>
|
||||||
{canUpload && (
|
<Dropdown isOpen={this.state.isDesktopMenuOpen} toggle={this.toggleDesktopOpMenu}>
|
||||||
<Fragment>
|
<DropdownToggle
|
||||||
{Utils.isSupportUploadFolder() ?
|
tag="div"
|
||||||
<Fragment>
|
role="button"
|
||||||
<button className="btn btn-secondary operation-item" onClick={this.onUploadClick} aria-haspopup="true" aria-expanded={this.state.isUploadMenuShow} aria-controls="upload-menu">{gettext('Upload')}</button>
|
className="path-item"
|
||||||
{this.state.isUploadMenuShow && (
|
title={gettext('More operations')}
|
||||||
<div className="menu dropdown-menu" style={this.state.operationMenuStyle} role="menu" id="upload-menu">
|
aria-label={gettext('More operations')}
|
||||||
<button type="button" className="dropdown-item" onClick={this.onUploadFile} role="menuitem">{gettext('Upload Files')}</button>
|
onClick={this.toggleDesktopOpMenu}
|
||||||
<button type="button" className="dropdown-item" onClick={this.onUploadFolder} role="menuitem">{gettext('Upload Folder')}</button>
|
onKeyDown={this.onDropdownToggleKeyDown}
|
||||||
</div>
|
data-toggle="dropdown"
|
||||||
)}
|
>
|
||||||
</Fragment>
|
{this.props.children}
|
||||||
:
|
<i className="sf3-font-drop-down sf3-font ml-1 path-item-dropdown-toggle"></i>
|
||||||
<button className="btn btn-secondary operation-item" title={gettext('Upload')} onClick={this.onUploadFile}>{gettext('Upload')}</button>}
|
</DropdownToggle>
|
||||||
</Fragment>
|
<DropdownMenu onMouseMove={this.onDropDownMouseMove} style={{'width': '200px'}}>
|
||||||
)}
|
{opList.map((item, index)=> {
|
||||||
{canCreate &&
|
if (item == 'Divider') {
|
||||||
<Fragment>
|
return <DropdownItem key={index} divider />;
|
||||||
<button className="btn btn-secondary operation-item" onClick={this.onCreateClick} aria-haspopup="true" aria-expanded={this.state.isUploadMenuShow} aria-controls="new-menu">{gettext('New')}</button>
|
} else if (item.subOpList) {
|
||||||
{this.state.isCreateMenuShow && (
|
return (
|
||||||
<div className="menu dropdown-menu" style={this.state.operationMenuStyle} role="menu" id="new-menu">
|
<Dropdown
|
||||||
<button className="dropdown-item" onClick={this.onCreateFolderToggle} role="menuitem">{gettext('New Folder')}</button>
|
key={index}
|
||||||
<button className="dropdown-item" onClick={this.onCreateFileToggle}>{gettext('New File')}</button>
|
direction="right"
|
||||||
<div className="dropdown-divider"></div>
|
className="w-100"
|
||||||
<button className="dropdown-item" onClick={this.onCreateMarkdownToggle} role="menuitem">{gettext('New Markdown File')}</button>
|
isOpen={this.state.isSubMenuShown && this.state.currentItem == item.text}
|
||||||
<button className="dropdown-item" onClick={this.onCreateExcelToggle} role="menuitem">{gettext('New Excel File')}</button>
|
toggle={this.toggleSubMenu}
|
||||||
<button className="dropdown-item" onClick={this.onCreatePPTToggle} role="menuitem">{gettext('New PowerPoint File')}</button>
|
onMouseMove={(e) => {e.stopPropagation();}}
|
||||||
<button className="dropdown-item" onClick={this.onCreateWordToggle} role="menuitem">{gettext('New Word File')}</button>
|
>
|
||||||
{enableSeadoc && !repoEncrypted && <button className="dropdown-item" onClick={this.onCreateSeaDocToggle} role="menuitem">{gettext('New SeaDoc File')} (beta)</button>}
|
<DropdownToggle
|
||||||
</div>
|
caret
|
||||||
)}
|
className="dropdown-item font-weight-normal rounded-0 d-flex align-items-center pr-2"
|
||||||
</Fragment>
|
onMouseEnter={this.toggleSubMenuShown.bind(this, item)}
|
||||||
}
|
>
|
||||||
{showShareBtn && <button className="btn btn-secondary operation-item" title={gettext('Share')} onClick={this.onShareClick}>{gettext('Share')}</button>}
|
<i className={`sf3-font-${item.icon} sf3-font mr-2 dropdown-item-icon`}></i>
|
||||||
|
<span className="mr-auto">{item.text}</span>
|
||||||
|
</DropdownToggle>
|
||||||
|
<DropdownMenu>
|
||||||
|
{item.subOpList.map((item, index)=> {
|
||||||
|
if (item == 'Divider') {
|
||||||
|
return <DropdownItem key={index} divider />;
|
||||||
|
} else {
|
||||||
|
return (<DropdownItem key={index} onClick={item.onClick} onKeyDown={this.onMenuItemKeyDown.bind(this, item)}>{item.text}</DropdownItem>);
|
||||||
|
}
|
||||||
|
})}
|
||||||
|
</DropdownMenu>
|
||||||
|
</Dropdown>
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
return (<DropdownItem key={index} onClick={item.onClick} onKeyDown={this.onMenuItemKeyDown.bind(this, item)}>
|
||||||
|
<i className={`sf3-font-${item.icon} sf3-font mr-2 dropdown-item-icon`}></i>
|
||||||
|
{item.text}
|
||||||
|
</DropdownItem>);
|
||||||
|
}
|
||||||
|
})}
|
||||||
|
</DropdownMenu>
|
||||||
|
</Dropdown>
|
||||||
</Fragment>
|
</Fragment>
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
|
@@ -237,3 +237,25 @@
|
|||||||
.op-btn:hover {
|
.op-btn:hover {
|
||||||
background: #f5f5f5;
|
background: #f5f5f5;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.dir-view-path .path-item {
|
||||||
|
min-width: 0; /* overwrite some styles */
|
||||||
|
padding: 0 6px;
|
||||||
|
font-size: 1rem;
|
||||||
|
color: inherit;
|
||||||
|
border-radius: 3px;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dir-view-path .path-item:hover {
|
||||||
|
background: #efefef;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dir-view-path .path-item-dropdown-toggle {
|
||||||
|
color: #999;
|
||||||
|
font-size: .6rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dir-view-path .path-split {
|
||||||
|
padding: 0 2px;
|
||||||
|
}
|
||||||
|
@@ -209,6 +209,8 @@ class LibContentContainer extends React.Component {
|
|||||||
<CurDirPath
|
<CurDirPath
|
||||||
repoID={repoID}
|
repoID={repoID}
|
||||||
repoName={this.props.currentRepoInfo.repo_name}
|
repoName={this.props.currentRepoInfo.repo_name}
|
||||||
|
repoEncrypted={this.props.repoEncrypted}
|
||||||
|
isGroupOwnedRepo={this.props.isGroupOwnedRepo}
|
||||||
pathPrefix={this.props.pathPrefix}
|
pathPrefix={this.props.pathPrefix}
|
||||||
currentPath={this.props.path}
|
currentPath={this.props.path}
|
||||||
userPerm={this.props.userPerm}
|
userPerm={this.props.userPerm}
|
||||||
@@ -226,6 +228,13 @@ class LibContentContainer extends React.Component {
|
|||||||
currentMode={this.props.currentMode}
|
currentMode={this.props.currentMode}
|
||||||
switchViewMode={this.props.switchViewMode}
|
switchViewMode={this.props.switchViewMode}
|
||||||
isCustomPermission={this.props.isCustomPermission}
|
isCustomPermission={this.props.isCustomPermission}
|
||||||
|
enableDirPrivateShare={this.props.enableDirPrivateShare}
|
||||||
|
showShareBtn={this.props.showShareBtn}
|
||||||
|
onAddFolder={this.props.onAddFolder}
|
||||||
|
onAddFile={this.props.onAddFile}
|
||||||
|
onUploadFile={this.props.onUploadFile}
|
||||||
|
onUploadFolder={this.props.onUploadFolder}
|
||||||
|
fullDirentList={this.props.fullDirentList}
|
||||||
/>
|
/>
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
|
@@ -2,7 +2,6 @@ import React, { Fragment } from 'react';
|
|||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import { gettext } from '../../utils/constants';
|
import { gettext } from '../../utils/constants';
|
||||||
import CommonToolbar from '../../components/toolbar/common-toolbar';
|
import CommonToolbar from '../../components/toolbar/common-toolbar';
|
||||||
import DirOperationToolBar from '../../components/toolbar/dir-operation-toolbar';
|
|
||||||
import ViewFileToolbar from '../../components/toolbar/view-file-toolbar';
|
import ViewFileToolbar from '../../components/toolbar/view-file-toolbar';
|
||||||
|
|
||||||
const propTypes = {
|
const propTypes = {
|
||||||
@@ -86,25 +85,6 @@ class LibContentToolbar extends React.Component {
|
|||||||
<Fragment>
|
<Fragment>
|
||||||
<div className="cur-view-toolbar">
|
<div className="cur-view-toolbar">
|
||||||
<span className="sf2-icon-menu hidden-md-up d-md-none side-nav-toggle" title={gettext('Side Nav Menu')} onClick={this.props.onSideNavMenuClick}></span>
|
<span className="sf2-icon-menu hidden-md-up d-md-none side-nav-toggle" title={gettext('Side Nav Menu')} onClick={this.props.onSideNavMenuClick}></span>
|
||||||
{!this.props.isDirentSelected &&
|
|
||||||
<DirOperationToolBar
|
|
||||||
path={this.props.path}
|
|
||||||
repoID={this.props.repoID}
|
|
||||||
repoName={this.props.repoName}
|
|
||||||
repoEncrypted={this.props.repoEncrypted}
|
|
||||||
direntList={this.props.direntList}
|
|
||||||
showShareBtn={this.props.showShareBtn}
|
|
||||||
enableDirPrivateShare={this.props.enableDirPrivateShare}
|
|
||||||
userPerm={this.props.userPerm}
|
|
||||||
isGroupOwnedRepo={this.props.isGroupOwnedRepo}
|
|
||||||
onAddFile={this.props.onAddFile}
|
|
||||||
onAddFolder={this.props.onAddFolder}
|
|
||||||
onUploadFile={this.props.onUploadFile}
|
|
||||||
onUploadFolder={this.props.onUploadFolder}
|
|
||||||
currentMode={this.props.currentMode}
|
|
||||||
switchViewMode={this.props.switchViewMode}
|
|
||||||
/>
|
|
||||||
}
|
|
||||||
</div>
|
</div>
|
||||||
<CommonToolbar
|
<CommonToolbar
|
||||||
isLibView={true}
|
isLibView={true}
|
||||||
|
@@ -2138,6 +2138,9 @@ class LibContentView extends React.Component {
|
|||||||
updateDetail={this.state.updateDetail}
|
updateDetail={this.state.updateDetail}
|
||||||
onListContainerScroll={this.onListContainerScroll}
|
onListContainerScroll={this.onListContainerScroll}
|
||||||
loadDirentList={this.loadDirentList}
|
loadDirentList={this.loadDirentList}
|
||||||
|
showShareBtn={showShareBtn}
|
||||||
|
onUploadFile={this.onUploadFile}
|
||||||
|
onUploadFolder={this.onUploadFolder}
|
||||||
/>
|
/>
|
||||||
{canUpload && this.state.pathExist && !this.state.isViewFile && (
|
{canUpload && this.state.pathExist && !this.state.isViewFile && (
|
||||||
<FileUploader
|
<FileUploader
|
||||||
|
@@ -1027,7 +1027,24 @@ a.table-sort-op:hover {
|
|||||||
color: #fff;
|
color: #fff;
|
||||||
background-color: #20a0ff;
|
background-color: #20a0ff;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.dropdown-item-icon,
|
||||||
|
.btn .dropdown-item-icon {
|
||||||
|
color: #444;
|
||||||
|
font-size: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.show>.btn-secondary.dropdown-toggle.dropdown-item .dropdown-item-icon {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dropdown-item:hover .dropdown-item-icon,
|
||||||
|
.dropdown-item:hover .btn .dropdown-item-icon,
|
||||||
|
.dropdown-item:focus .dropdown-item-icon,
|
||||||
|
.dropdown-item:focus .btn .dropdown-item-icon {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
/* empty-tip */
|
/* empty-tip */
|
||||||
.empty-tip {
|
.empty-tip {
|
||||||
margin: 5.5em 1em;
|
margin: 5.5em 1em;
|
||||||
|
@@ -1,11 +1,11 @@
|
|||||||
@font-face {
|
@font-face {
|
||||||
font-family: "sf3-font"; /* Project id 1230969 */
|
font-family: "sf3-font"; /* Project id 1230969 */
|
||||||
src: url('iconfont.eot?t=1716614768424'); /* IE9 */
|
src: url('iconfont.eot?t=1716779999367'); /* IE9 */
|
||||||
src: url('iconfont.eot?t=1716614768424#iefix') format('embedded-opentype'), /* IE6-IE8 */
|
src: url('iconfont.eot?t=1716779999367#iefix') format('embedded-opentype'), /* IE6-IE8 */
|
||||||
url('iconfont.woff2?t=1716614768424') format('woff2'),
|
url('iconfont.woff2?t=1716779999367') format('woff2'),
|
||||||
url('iconfont.woff?t=1716614768424') format('woff'),
|
url('iconfont.woff?t=1716779999367') format('woff'),
|
||||||
url('iconfont.ttf?t=1716614768424') format('truetype'),
|
url('iconfont.ttf?t=1716779999367') format('truetype'),
|
||||||
url('iconfont.svg?t=1716614768424#sf3-font') format('svg');
|
url('iconfont.svg?t=1716779999367#sf3-font') format('svg');
|
||||||
}
|
}
|
||||||
|
|
||||||
.sf3-font {
|
.sf3-font {
|
||||||
@@ -16,6 +16,10 @@
|
|||||||
-moz-osx-font-smoothing: grayscale;
|
-moz-osx-font-smoothing: grayscale;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.sf3-font-upload-files:before {
|
||||||
|
content: "\e821";
|
||||||
|
}
|
||||||
|
|
||||||
.sf3-font-share:before {
|
.sf3-font-share:before {
|
||||||
content: "\e820";
|
content: "\e820";
|
||||||
}
|
}
|
||||||
|
Binary file not shown.
File diff suppressed because one or more lines are too long
@@ -14,6 +14,8 @@
|
|||||||
/>
|
/>
|
||||||
<missing-glyph />
|
<missing-glyph />
|
||||||
|
|
||||||
|
<glyph glyph-name="upload-files" unicode="" d="M160 160v-160h704v160h96v-192c0-35.2-25.6-60.8-57.6-64H128c-35.2 0-64 28.8-64 64v192h96zM518.4 864l278.4-268.8-80-76.8-156.8 150.4v-585.6h-96V656L320 518.4 240 595.2 518.4 864z" horiz-adv-x="1024" />
|
||||||
|
|
||||||
<glyph glyph-name="share" unicode="" d="M800 832c-70.4 0-128-54.4-128-128s57.6-128 128-128 128 54.4 128 128-57.6 128-128 128zM224 512c-70.4 0-128-54.4-128-128s57.6-128 128-128 128 54.4 128 128-57.6 128-128 128z m576-320c-70.4 0-128-54.4-128-128s57.6-128 128-128 128 54.4 128 128-60.8 128-128 128z m-425.6 307.2l217.6 134.4 48-83.2-217.6-134.4-48 83.2z m60.8-169.6l220.8-131.2-48-80-220.8 131.2 48 80z" horiz-adv-x="1024" />
|
<glyph glyph-name="share" unicode="" d="M800 832c-70.4 0-128-54.4-128-128s57.6-128 128-128 128 54.4 128 128-57.6 128-128 128zM224 512c-70.4 0-128-54.4-128-128s57.6-128 128-128 128 54.4 128 128-57.6 128-128 128z m576-320c-70.4 0-128-54.4-128-128s57.6-128 128-128 128 54.4 128 128-60.8 128-128 128z m-425.6 307.2l217.6 134.4 48-83.2-217.6-134.4-48 83.2z m60.8-169.6l220.8-131.2-48-80-220.8 131.2 48 80z" horiz-adv-x="1024" />
|
||||||
|
|
||||||
<glyph glyph-name="rename" unicode="" d="M796.8 873.6L928 742.4c32-32 32-83.2 0-112L336 32l-265.6-19.2 16 262.4L681.6 873.6c28.8 28.8 86.4 28.8 115.2 0z m-204.8-227.2L182.4 233.6l-6.4-115.2 118.4 9.6L704 537.6l-112 108.8z m147.2 147.2l-80-80L768 604.8l80 80-108.8 108.8zM976-128h-928C22.4-128 0-105.6 0-80S22.4-32 48-32h928c25.6 0 48-22.4 48-48s-22.4-48-48-48z" horiz-adv-x="1024" />
|
<glyph glyph-name="rename" unicode="" d="M796.8 873.6L928 742.4c32-32 32-83.2 0-112L336 32l-265.6-19.2 16 262.4L681.6 873.6c28.8 28.8 86.4 28.8 115.2 0z m-204.8-227.2L182.4 233.6l-6.4-115.2 118.4 9.6L704 537.6l-112 108.8z m147.2 147.2l-80-80L768 604.8l80 80-108.8 108.8zM976-128h-928C22.4-128 0-105.6 0-80S22.4-32 48-32h928c25.6 0 48-22.4 48-48s-22.4-48-48-48z" horiz-adv-x="1024" />
|
||||||
|
Before Width: | Height: | Size: 47 KiB After Width: | Height: | Size: 47 KiB |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user