@@ -95,4 +70,4 @@ class CreateFileForder extends React.Component {
}
}
-export default CreateFileForder;
+export default CreateForder;
diff --git a/frontend/src/components/menu-component/menu-dialog/delete-dialog.js b/frontend/src/components/dialog/delete-dialog.js
similarity index 95%
rename from frontend/src/components/menu-component/menu-dialog/delete-dialog.js
rename to frontend/src/components/dialog/delete-dialog.js
index 7a82f99fe1..64d4c12f49 100644
--- a/frontend/src/components/menu-component/menu-dialog/delete-dialog.js
+++ b/frontend/src/components/dialog/delete-dialog.js
@@ -1,6 +1,6 @@
import React from 'react';
import PropTypes from 'prop-types';
-import { gettext } from '../../../utils/constants';
+import { gettext } from '../../utils/constants';
import { Button, Modal, ModalHeader, ModalBody, ModalFooter } from 'reactstrap';
const propTypes = {
diff --git a/frontend/src/components/menu-component/menu-dialog/rename-dialog.js b/frontend/src/components/dialog/rename-dialog.js
similarity index 97%
rename from frontend/src/components/menu-component/menu-dialog/rename-dialog.js
rename to frontend/src/components/dialog/rename-dialog.js
index b4878e5301..bcbd7939d0 100644
--- a/frontend/src/components/menu-component/menu-dialog/rename-dialog.js
+++ b/frontend/src/components/dialog/rename-dialog.js
@@ -1,5 +1,5 @@
import React from 'react';
-import { gettext } from '../../../utils/constants';
+import { gettext } from '../../utils/constants';
import { Button, Modal, ModalHeader, Input, ModalBody, ModalFooter } from 'reactstrap';
class Rename extends React.Component {
diff --git a/frontend/src/components/draft-list-view/draft-list-item.js b/frontend/src/components/draft-list-view/draft-list-item.js
index b2dc606c9f..9455f5f6ab 100644
--- a/frontend/src/components/draft-list-view/draft-list-item.js
+++ b/frontend/src/components/draft-list-view/draft-list-item.js
@@ -1,7 +1,7 @@
import React from 'react';
import PropTypes from 'prop-types';
import { siteRoot, lang } from '../../utils/constants';
-import NodeMenuControl from '../menu-component/node-menu-control';
+import MenuControl from '../menu-control';
import moment from 'moment';
moment.locale(lang);
@@ -87,7 +87,7 @@ class DraftListItem extends React.Component {
{
this.props.draft.review_status !== 'open' &&
-
diff --git a/frontend/src/components/history-list-view/history-list-item.js b/frontend/src/components/history-list-view/history-list-item.js
index 6d34373e89..4173d7989a 100644
--- a/frontend/src/components/history-list-view/history-list-item.js
+++ b/frontend/src/components/history-list-view/history-list-item.js
@@ -1,7 +1,7 @@
import React from 'react';
import PropTypes from 'prop-types';
import moment from 'moment';
-import NodeMenuControl from '../menu-component/node-menu-control';
+import MenuControl from '../menu-control';
moment.locale(window.app.config.lang);
const propTypes = {
@@ -70,7 +70,7 @@ class HistoryListItem extends React.Component {
-
diff --git a/frontend/src/components/menu-component/node-menu-control.js b/frontend/src/components/menu-component/node-menu-control.js
deleted file mode 100644
index 97a685bfb8..0000000000
--- a/frontend/src/components/menu-component/node-menu-control.js
+++ /dev/null
@@ -1,30 +0,0 @@
-import React from 'react';
-import PropTypes from 'prop-types';
-
-const propTypes = {
- isShow: PropTypes.bool.isRequired,
- currentNode: PropTypes.object,
- onClick: PropTypes.func.isRequired,
-};
-
-class NodeMenuControl extends React.Component {
-
- onClick = (e) => {
- let node = this.props.currentNode;
- this.props.onClick(e, node);
- }
-
- render() {
- return (
-
-
- );
- }
-}
-
-NodeMenuControl.propTypes = propTypes;
-
-export default NodeMenuControl;
\ No newline at end of file
diff --git a/frontend/src/components/menu-control.js b/frontend/src/components/menu-control.js
new file mode 100644
index 0000000000..4bd53cc0d8
--- /dev/null
+++ b/frontend/src/components/menu-control.js
@@ -0,0 +1,19 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+
+const propTypes = {
+ isShow: PropTypes.bool.isRequired,
+};
+
+class MenuControl extends React.Component {
+
+ render() {
+ return (
+
+ );
+ }
+}
+
+MenuControl.propTypes = propTypes;
+
+export default MenuControl;
\ No newline at end of file
diff --git a/frontend/src/components/review-list-view/review-list-item.js b/frontend/src/components/review-list-view/review-list-item.js
index df9963ec4a..00210665c3 100644
--- a/frontend/src/components/review-list-view/review-list-item.js
+++ b/frontend/src/components/review-list-view/review-list-item.js
@@ -1,7 +1,7 @@
import React from 'react';
import PropTypes from 'prop-types';
-import { siteRoot, lang } from '../../utils/constants';
import moment from 'moment';
+import { siteRoot, lang } from '../../utils/constants';
moment.locale(lang);
const propTypes = {
diff --git a/frontend/src/components/menu-component/node-menu.js b/frontend/src/components/tree-view/node-menu.js
similarity index 78%
rename from frontend/src/components/menu-component/node-menu.js
rename to frontend/src/components/tree-view/node-menu.js
index 3cacbea785..6fb0c1590f 100644
--- a/frontend/src/components/menu-component/node-menu.js
+++ b/frontend/src/components/tree-view/node-menu.js
@@ -2,11 +2,15 @@ import React from 'react';
import { gettext } from '../../utils/constants';
class NodeMenu extends React.Component {
-
- toggleAddFileFolder = (ev, flag) => {
- this.props.toggleAddFileFolder(flag);
+
+ toggleAddFile = () => {
+ this.props.toggleAddFile();
}
+ toggleAddFolder = () => {
+ this.props.toggleAddFolder();
+ }
+
toggleRename = () => {
this.props.toggleRename();
}
@@ -23,16 +27,16 @@ class NodeMenu extends React.Component {
if (this.props.currentNode.name === '/') {
return (
- - {gettext('New Folder')}
- - this.toggleAddFileFolder(ev,true)}>{gettext('New File')}
+ - {gettext('New Folder')}
+ - {gettext('New File')}
);
}
return (
- - {gettext('New Folder')}
- - this.toggleAddFileFolder(ev,true)}>{gettext('New File')}
+ - {gettext('New Folder')}
+ - {gettext('New File')}
- {gettext('Rename')}
- {gettext('Delete')}
diff --git a/frontend/src/components/tree-view/tree-node-view.js b/frontend/src/components/tree-view/tree-node-view.js
index 0a77e9e6fc..f3546971e7 100644
--- a/frontend/src/components/tree-view/tree-node-view.js
+++ b/frontend/src/components/tree-view/tree-node-view.js
@@ -1,5 +1,5 @@
import React from 'react';
-import MenuControl from '../menu-component/node-menu-control';
+import MenuControl from '../menu-control';
import { permission } from '../../utils/constants';
function sortByType(a, b) {
diff --git a/frontend/src/css/toolbar.css b/frontend/src/css/toolbar.css
index abad25c022..c392f4573d 100644
--- a/frontend/src/css/toolbar.css
+++ b/frontend/src/css/toolbar.css
@@ -1,5 +1,5 @@
-/* begin current-module-toobar */
+/* begin toobar-container */
.cur-view-toolbar {
position: relative;
display: flex;
@@ -15,7 +15,10 @@
content: '';
}
-.top-toolbar-btn {
+/* end toolbar-container */
+
+/* file-operation toolbar eg: edit, upload, new, share*/
+.operation-item {
padding: 0 0.25rem;
margin-right: 0.25rem;
height: 30px;
@@ -29,7 +32,10 @@
border-radius: 2px;
}
-.sf-view-mode-change-btn {
+/* end file-operation toolbar */
+
+/* begin view-mode toolbar */
+.sf-view-mode-btn {
padding: 0;
height: 30px;
min-width: 2rem;
@@ -41,12 +47,11 @@
border-radius: 0 !important;
}
-.sf-view-mode-change-btn.current-mode {
+.sf-view-mode-btn.current-mode {
background-color: #ccc !important;
color: #fff !important;
}
-
-/* end current-module-toobar */
+/* end view-mode toolbar */
/* begin common-toolbar */
.common-toolbar {
@@ -81,3 +86,4 @@
text-decoration:none;
}
/* end path toolbar */
+
diff --git a/frontend/src/pages/repo-wiki-mode/main-panel.js b/frontend/src/pages/repo-wiki-mode/main-panel.js
index 54e0dec99a..118e34469a 100644
--- a/frontend/src/pages/repo-wiki-mode/main-panel.js
+++ b/frontend/src/pages/repo-wiki-mode/main-panel.js
@@ -2,11 +2,13 @@ import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { gettext, repoID, serviceUrl, slug, siteRoot } from '../../utils/constants';
import { seafileAPI } from '../../utils/seafile-api';
+import Dirent from '../../models/dirent';
import CommonToolbar from '../../components/toolbar/common-toolbar';
import PathToolbar from '../../components/toolbar/path-toolbar';
import MarkdownViewer from '../../components/markdown-viewer';
import DirentListView from '../../components/dirent-list-view/dirent-list-view';
-import Dirent from '../../models/dirent';
+import CreateFolder from '../../components/dialog/create-folder-dialog';
+import CreateFile from '../../components/dialog/create-file-dialog';
const propTypes = {
content: PropTypes.string,
@@ -29,10 +31,19 @@ class MainPanel extends Component {
super(props);
this.state = {
isWikiMode: true,
- direntList: []
+ direntList: [],
+ newMenuShow: false,
+ uploadMenuShow: false,
+ showFileDialog: false,
+ showFolderDialog: false,
+ createFileType: '',
};
}
+ componentDidMount() {
+ document.addEventListener('click', this.hideOperationMenu);
+ }
+
componentWillReceiveProps(nextProps) {
let node = nextProps.changedNode;
if (node && node.isDir()) {
@@ -41,6 +52,10 @@ class MainPanel extends Component {
}
}
+ componentWillUnmount() {
+ document.removeEventListener('click', this.hideOperationMenu);
+ }
+
updateViewList = (filePath) => {
seafileAPI.listDir(repoID, filePath, 48).then(res => {
let direntList = [];
@@ -76,6 +91,78 @@ class MainPanel extends Component {
window.location.href= serviceUrl + '/lib/' + repoID + '/file' + this.props.filePath + '?mode=edit';
}
+ onUploadClick = (e) => {
+ this.toggleOperationMenu(e);
+ this.setState({
+ newMenuShow: false,
+ uploadMenuShow: !this.state.uploadMenuShow,
+ });
+ }
+
+ onNewClick = (e) => {
+ this.toggleOperationMenu(e);
+ this.setState({
+ newMenuShow: !this.state.newMenuShow,
+ uploadMenuShow: false,
+ });
+ }
+
+ onShareClick = () => {
+ alert('share btn clicked');
+ }
+
+ toggleOperationMenu = (e) => {
+ e.nativeEvent.stopImmediatePropagation();
+ let targetRect = e.target.getClientRects()[0];
+ let left = targetRect.x;
+ let top = targetRect.y + targetRect.height;
+ let style = {position: 'fixed', display: 'block', left: left, top: top};
+ this.setState({operationMenuStyle: style});
+ }
+
+ hideOperationMenu = () => {
+ this.setState({
+ uploadMenuShow: false,
+ newMenuShow: false,
+ });
+ }
+
+ addFolder = () => {
+ this.setState({showFolderDialog: !this.showFolderDialog});
+ }
+
+ addFile = () => {
+ this.setState({
+ showFileDialog: !this.showFileDialog,
+ createFileType: '',
+ });
+ }
+
+ addMarkdownFile = () => {
+ this.setState({
+ showFileDialog: !this.showFileDialog,
+ createFileType: '.md',
+ });
+ }
+
+ addFolderCancel = () => {
+ this.setState({showFolderDialog: !this.state.showFolderDialog});
+ }
+
+ addFileCancel = () => {
+ this.setState({showFileDialog: !this.state.showFileDialog});
+ }
+
+ onMainAddFile = (filePath) => {
+ this.setState({showFileDialog: !this.state.showFileDialog});
+ this.props.onMainAddFile(filePath);
+ }
+
+ onMainAddFolder = (dirPath) => {
+ this.setState({showFolderDialog: !this.state.showFolderDialog});
+ this.props.onMainAddFolder(dirPath);
+ }
+
render() {
let filePathList = this.props.filePath.split('/');
let nodePath = '';
@@ -108,14 +195,37 @@ class MainPanel extends Component {
- {
- this.props.permission === 'rw' &&
-
- }
-
-
-
-
+
+
+ {
+ this.props.permission === 'rw' &&
+
+ }
+
+
+
+
+ {
+ this.state.uploadMenuShow &&
+
+ - {gettext('Upload Files')}
+ - {gettext('Upload Folder')}
+
+ }
+ {
+ this.state.newMenuShow &&
+
+ - {gettext('New Folder')}
+ - {gettext('New File')}
+
+ - {gettext('New Markdown File')}
+
+ }
+
+
+
+
+
@@ -153,6 +263,21 @@ class MainPanel extends Component {
}
+ {this.state.showFileDialog &&
+
+ }
+ {this.state.showFolderDialog &&
+
+ }
);
}
diff --git a/frontend/src/pages/repo-wiki-mode/side-panel.js b/frontend/src/pages/repo-wiki-mode/side-panel.js
index 46d97ec9eb..544c2e0dcd 100644
--- a/frontend/src/pages/repo-wiki-mode/side-panel.js
+++ b/frontend/src/pages/repo-wiki-mode/side-panel.js
@@ -1,11 +1,12 @@
import React, { Component } from 'react';
import { gettext, siteRoot, logoPath, mediaUrl, siteTitle, logoWidth, logoHeight } from '../../utils/constants';
import TreeView from '../../components/tree-view/tree-view';
-import NodeMenu from '../../components/menu-component/node-menu';
-import MenuControl from '../../components/menu-component/node-menu-control';
-import Delete from '../../components/menu-component/menu-dialog/delete-dialog';
-import Rename from '../../components/menu-component/menu-dialog/rename-dialog';
-import CreateFlieFolder from '../../components/menu-component/menu-dialog/create-fileforder-dialog';
+import NodeMenu from '../../components/tree-view/node-menu';
+import MenuControl from '../../components/menu-control';
+import Delete from '../../components/dialog/delete-dialog';
+import Rename from '../../components/dialog/rename-dialog';
+import CreateFolder from '../../components/dialog/create-folder-dialog';
+import CreateFile from '../../components/dialog/create-file-dialog';
class SidePanel extends Component {
@@ -22,7 +23,8 @@ class SidePanel extends Component {
isLoadFailed: false,
isMenuIconShow: false,
showDelete: false,
- showAddFileFolder: false,
+ showFile: false,
+ showFolder: false,
showRename: false,
isFile: false
};
@@ -85,12 +87,13 @@ class SidePanel extends Component {
});
}
- toggleAddFileFolder = (flag) => {
- let isFile = flag === true ? true : false;
- this.setState({
- showAddFileFolder: !this.state.showAddFileFolder,
- isFile: isFile
- });
+ toggleAddFile = () => {
+ this.setState({showFile: !this.state.showFile});
+ this.onHideContextMenu();
+ }
+
+ toggleAddFolder = () => {
+ this.setState({showFolder: !this.state.showFolder});
this.onHideContextMenu();
}
@@ -105,12 +108,12 @@ class SidePanel extends Component {
}
onAddFolderNode = (dirPath) => {
- this.setState({showAddFileFolder: !this.state.showAddFileFolder});
+ this.setState({showFolder: !this.state.showFolder});
this.props.onAddFolderNode(dirPath);
}
onAddFileNode = (filePath) => {
- this.setState({showAddFileFolder: !this.state.showAddFileFolder});
+ this.setState({showFile: !this.state.showFile});
this.props.onAddFileNode(filePath);
}
@@ -141,11 +144,11 @@ class SidePanel extends Component {
}
addFolderCancel = () => {
- this.setState({showAddFileFolder: !this.state.showAddFileFolder});
+ this.setState({showFolder: !this.state.showFolder});
}
addFileCancel = () => {
- this.setState({showAddFileFolder: !this.state.showAddFileFolder});
+ this.setState({showFile: !this.state.showFile});
}
deleteCancel = () => {
@@ -195,7 +198,8 @@ class SidePanel extends Component {
@@ -207,16 +211,21 @@ class SidePanel extends Component {
toggleCancel={this.deleteCancel}
/>
}
- {this.state.showAddFileFolder &&
-
}
+ {this.state.showFolder &&
+
+ }
{this.state.showRename &&
{
this.props.permission === 'rw' &&
-
+
}
diff --git a/frontend/src/pages/wiki/side-panel.js b/frontend/src/pages/wiki/side-panel.js
index b79c2ecf95..3f5b3c59f6 100644
--- a/frontend/src/pages/wiki/side-panel.js
+++ b/frontend/src/pages/wiki/side-panel.js
@@ -1,11 +1,12 @@
import React, { Component } from 'react';
import { gettext, siteRoot, logoPath, mediaUrl, siteTitle, logoWidth, logoHeight } from '../../utils/constants';
import TreeView from '../../components/tree-view/tree-view';
-import NodeMenu from '../../components/menu-component/node-menu';
-import MenuControl from '../../components/menu-component/node-menu-control';
-import Delete from '../../components/menu-component/menu-dialog/delete-dialog';
-import Rename from '../../components/menu-component/menu-dialog/rename-dialog';
-import CreateFlieFolder from '../../components/menu-component/menu-dialog/create-fileforder-dialog';
+import NodeMenu from '../../components/tree-view/node-menu';
+import MenuControl from '../../components/menu-control';
+import Delete from '../../components/dialog/delete-dialog';
+import Rename from '../../components/dialog/rename-dialog';
+import CreateFolder from '../../components/dialog/create-folder-dialog';
+import CreateFile from '../../components/dialog/create-file-dialog';
class SidePanel extends Component {
@@ -22,9 +23,9 @@ class SidePanel extends Component {
isLoadFailed: false,
isMenuIconShow: false,
showDelete: false,
- showAddFileFolder: false,
+ showFile: false,
+ showFolder: false,
showRename: false,
- isFile: false
};
this.searchedPath = null;
}
@@ -85,12 +86,13 @@ class SidePanel extends Component {
});
}
- toggleAddFileFolder = (flag) => {
- let isFile = flag === true ? true : false;
- this.setState({
- showAddFileFolder: !this.state.showAddFileFolder,
- isFile: isFile
- });
+ toggleAddFile = () => {
+ this.setState({showFile: !this.state.showFile});
+ this.onHideContextMenu();
+ }
+
+ toggleAddFolder = () => {
+ this.setState({showFolder: !this.state.showFolder});
this.onHideContextMenu();
}
@@ -105,12 +107,12 @@ class SidePanel extends Component {
}
onAddFolderNode = (dirPath) => {
- this.setState({showAddFileFolder: !this.state.showAddFileFolder});
+ this.setState({showFolder: !this.state.showFolder});
this.props.onAddFolderNode(dirPath);
}
onAddFileNode = (filePath) => {
- this.setState({showAddFileFolder: !this.state.showAddFileFolder});
+ this.setState({showFile: !this.state.showFile});
this.props.onAddFileNode(filePath);
}
@@ -141,11 +143,11 @@ class SidePanel extends Component {
}
addFolderCancel = () => {
- this.setState({showAddFileFolder: !this.state.showAddFileFolder});
+ this.setState({showFolder: !this.state.showFolder});
}
addFileCancel = () => {
- this.setState({showAddFileFolder: !this.state.showAddFileFolder});
+ this.setState({showFile: !this.state.showFile});
}
deleteCancel = () => {
@@ -195,7 +197,8 @@ class SidePanel extends Component {
@@ -207,16 +210,21 @@ class SidePanel extends Component {
toggleCancel={this.deleteCancel}
/>
}
- {this.state.showAddFileFolder &&
-
}
+ {this.state.showFolder &&
+
+ }
{this.state.showRename &&
);
|