mirror of
https://github.com/haiwen/seahub.git
synced 2025-09-01 15:09:14 +00:00
Resolve warring (#3454)
* Resole project warrings * Delete extra blank lines * resolve dir-column-nav warnings
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
import React ,{ Fragment } from 'react';
|
import React ,{ Fragment } from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import { Button, Modal, ModalHeader, ModalBody, ModalFooter, Alert } from 'reactstrap';
|
import { Button, ModalHeader, ModalBody, ModalFooter, Alert } from 'reactstrap';
|
||||||
import { gettext } from '../../utils/constants';
|
import { gettext } from '../../utils/constants';
|
||||||
import { seafileAPI } from '../../utils/seafile-api';
|
import { seafileAPI } from '../../utils/seafile-api';
|
||||||
import { Utils } from '../../utils/utils';
|
import { Utils } from '../../utils/utils';
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
import React ,{ Fragment } from 'react';
|
import React ,{ Fragment } from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import { Button, Modal, ModalHeader, ModalBody, ModalFooter, Table } from 'reactstrap';
|
import { Button, ModalHeader, ModalBody, ModalFooter, Table } from 'reactstrap';
|
||||||
import Dirent from '../../models/dirent';
|
import Dirent from '../../models/dirent';
|
||||||
import { gettext, siteRoot } from '../../utils/constants';
|
import { gettext, siteRoot } from '../../utils/constants';
|
||||||
import { Utils } from '../../utils/utils';
|
import { Utils } from '../../utils/utils';
|
||||||
|
@@ -5,7 +5,7 @@ import { Button } from 'reactstrap';
|
|||||||
import { seafileAPI } from '../../utils/seafile-api.js';
|
import { seafileAPI } from '../../utils/seafile-api.js';
|
||||||
import UserSelect from '../user-select';
|
import UserSelect from '../user-select';
|
||||||
import SharePermissionEditor from '../select-editor/share-permission-editor';
|
import SharePermissionEditor from '../select-editor/share-permission-editor';
|
||||||
import "../../css/invitations.css";
|
import '../../css/invitations.css';
|
||||||
|
|
||||||
class UserItem extends React.Component {
|
class UserItem extends React.Component {
|
||||||
|
|
||||||
|
@@ -30,6 +30,8 @@ const propTypes = {
|
|||||||
navRate: PropTypes.number,
|
navRate: PropTypes.number,
|
||||||
inResizing: PropTypes.bool.isRequired,
|
inResizing: PropTypes.bool.isRequired,
|
||||||
currentRepoInfo: PropTypes.object.isRequired,
|
currentRepoInfo: PropTypes.object.isRequired,
|
||||||
|
onItemMove: PropTypes.func.isRequired,
|
||||||
|
onItemCopy: PropTypes.func.isRequired,
|
||||||
selectedDirentList: PropTypes.array.isRequired,
|
selectedDirentList: PropTypes.array.isRequired,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -30,6 +30,7 @@ const propTypes = {
|
|||||||
showDirentDetail: PropTypes.func.isRequired,
|
showDirentDetail: PropTypes.func.isRequired,
|
||||||
onAddFolder: PropTypes.func.isRequired,
|
onAddFolder: PropTypes.func.isRequired,
|
||||||
onFileTagChanged: PropTypes.func,
|
onFileTagChanged: PropTypes.func,
|
||||||
|
onItemRename: PropTypes.func.isRequired,
|
||||||
};
|
};
|
||||||
|
|
||||||
class DirGridView extends React.Component {
|
class DirGridView extends React.Component {
|
||||||
|
@@ -13,6 +13,8 @@ const propTypes = {
|
|||||||
onGridItemClick: PropTypes.func.isRequired,
|
onGridItemClick: PropTypes.func.isRequired,
|
||||||
activeDirent: PropTypes.object,
|
activeDirent: PropTypes.object,
|
||||||
onGridItemMouseDown: PropTypes.func,
|
onGridItemMouseDown: PropTypes.func,
|
||||||
|
currentRepoInfo: PropTypes.object,
|
||||||
|
onItemMove: PropTypes.func.isRequired,
|
||||||
};
|
};
|
||||||
|
|
||||||
class DirentGridItem extends React.Component {
|
class DirentGridItem extends React.Component {
|
||||||
@@ -22,7 +24,7 @@ class DirentGridItem extends React.Component {
|
|||||||
this.state = {
|
this.state = {
|
||||||
isGridSelected: false,
|
isGridSelected: false,
|
||||||
isGridDropTipShow: false,
|
isGridDropTipShow: false,
|
||||||
}
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
componentWillReceiveProps(nextProps) {
|
componentWillReceiveProps(nextProps) {
|
||||||
@@ -30,7 +32,7 @@ class DirentGridItem extends React.Component {
|
|||||||
if (nextProps.activeDirent && nextProps.activeDirent.name === nextProps.dirent.name) {
|
if (nextProps.activeDirent && nextProps.activeDirent.name === nextProps.dirent.name) {
|
||||||
this.setState({isGridSelected: true});
|
this.setState({isGridSelected: true});
|
||||||
}
|
}
|
||||||
})
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
onItemMove = (destRepo, dirent, selectedPath, currentPath) => {
|
onItemMove = (destRepo, dirent, selectedPath, currentPath) => {
|
||||||
@@ -51,7 +53,7 @@ class DirentGridItem extends React.Component {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
this.setState({isGridSelected: false});
|
this.setState({isGridSelected: false});
|
||||||
this.props.onGridItemClick(this.props.dirent)
|
this.props.onGridItemClick(this.props.dirent);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -140,9 +142,9 @@ class DirentGridItem extends React.Component {
|
|||||||
}
|
}
|
||||||
let fileHref = siteRoot + 'lib/' + this.props.repoID + '/file' + Utils.encodePath(direntPath);
|
let fileHref = siteRoot + 'lib/' + this.props.repoID + '/file' + Utils.encodePath(direntPath);
|
||||||
|
|
||||||
let gridClass = 'grid-file-img-link cursor-pointer'
|
let gridClass = 'grid-file-img-link cursor-pointer';
|
||||||
gridClass += this.state.isGridSelected ? " grid-selected-active" : " ";
|
gridClass += this.state.isGridSelected ? ' grid-selected-active' : ' ';
|
||||||
gridClass += this.state.isGridDropTipShow ? " grid-drop-show" : " ";
|
gridClass += this.state.isGridDropTipShow ? ' grid-drop-show' : ' ';
|
||||||
|
|
||||||
let lockedInfo = gettext('locked by {name}');
|
let lockedInfo = gettext('locked by {name}');
|
||||||
lockedInfo = lockedInfo.replace('{name}', dirent.lock_owner_name);
|
lockedInfo = lockedInfo.replace('{name}', dirent.lock_owner_name);
|
||||||
@@ -167,11 +169,11 @@ class DirentGridItem extends React.Component {
|
|||||||
{dirent.is_locked && <img className="grid-file-locked-icon" src={mediaUrl + 'img/file-locked-32.png'} alt={gettext('locked')} title={lockedInfo}/>}
|
{dirent.is_locked && <img className="grid-file-locked-icon" src={mediaUrl + 'img/file-locked-32.png'} alt={gettext('locked')} title={lockedInfo}/>}
|
||||||
</div>
|
</div>
|
||||||
<div className="grid-file-name" onDragStart={this.onGridItemDragStart} draggable="true" >
|
<div className="grid-file-name" onDragStart={this.onGridItemDragStart} draggable="true" >
|
||||||
<a className={`grid-file-name-link ${this.state.isGridSelected ? "grid-link-selected-active" : ""}`} href={dirent.type === 'dir' ? dirHref : fileHref} onClick={this.onItemLinkClick}>{dirent.name}</a>
|
<a className={`grid-file-name-link ${this.state.isGridSelected ? 'grid-link-selected-active' : ''}`} href={dirent.type === 'dir' ? dirHref : fileHref} onClick={this.onItemLinkClick}>{dirent.name}</a>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
</Fragment>
|
</Fragment>
|
||||||
)
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -40,8 +40,8 @@ const propTypes = {
|
|||||||
isDirentDetailShow: PropTypes.bool.isRequired,
|
isDirentDetailShow: PropTypes.bool.isRequired,
|
||||||
onGridItemClick: PropTypes.func,
|
onGridItemClick: PropTypes.func,
|
||||||
onAddFolder: PropTypes.func.isRequired,
|
onAddFolder: PropTypes.func.isRequired,
|
||||||
showDirentDetail: PropTypes.func,
|
showDirentDetail: PropTypes.func.isRequired,
|
||||||
onItemRename: PropTypes.func,
|
onItemRename: PropTypes.func.isRequired,
|
||||||
};
|
};
|
||||||
|
|
||||||
class DirentGridView extends React.Component{
|
class DirentGridView extends React.Component{
|
||||||
|
@@ -45,6 +45,8 @@ const propTypes = {
|
|||||||
selectedDirentList: PropTypes.array.isRequired,
|
selectedDirentList: PropTypes.array.isRequired,
|
||||||
activeDirent: PropTypes.object,
|
activeDirent: PropTypes.object,
|
||||||
getDirentItemMenuList: PropTypes.func.isRequired,
|
getDirentItemMenuList: PropTypes.func.isRequired,
|
||||||
|
onFileTagChanged: PropTypes.func,
|
||||||
|
enableDirPrivateShare: PropTypes.bool.isRequired,
|
||||||
};
|
};
|
||||||
|
|
||||||
class DirentListItem extends React.Component {
|
class DirentListItem extends React.Component {
|
||||||
@@ -480,7 +482,7 @@ class DirentListItem extends React.Component {
|
|||||||
</Fragment>
|
</Fragment>
|
||||||
}
|
}
|
||||||
</Fragment>
|
</Fragment>
|
||||||
)
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
|
@@ -45,6 +45,8 @@ const propTypes = {
|
|||||||
onItemsCopy: PropTypes.func.isRequired,
|
onItemsCopy: PropTypes.func.isRequired,
|
||||||
onItemsDelete: PropTypes.func.isRequired,
|
onItemsDelete: PropTypes.func.isRequired,
|
||||||
onFileTagChanged: PropTypes.func,
|
onFileTagChanged: PropTypes.func,
|
||||||
|
enableDirPrivateShare: PropTypes.bool.isRequired,
|
||||||
|
isGroupOwnedRepo: PropTypes.bool.isRequired,
|
||||||
};
|
};
|
||||||
|
|
||||||
class DirentListView extends React.Component {
|
class DirentListView extends React.Component {
|
||||||
@@ -294,10 +296,10 @@ class DirentListView extends React.Component {
|
|||||||
let y = event.clientY || (event.touches && event.touches[0].pageY);
|
let y = event.clientY || (event.touches && event.touches[0].pageY);
|
||||||
|
|
||||||
if (this.props.posX) {
|
if (this.props.posX) {
|
||||||
x -= this.props.posX;
|
x -= this.props.posX;
|
||||||
}
|
}
|
||||||
if (this.props.posY) {
|
if (this.props.posY) {
|
||||||
y -= this.props.posY;
|
y -= this.props.posY;
|
||||||
}
|
}
|
||||||
|
|
||||||
hideMenu();
|
hideMenu();
|
||||||
@@ -326,7 +328,7 @@ class DirentListView extends React.Component {
|
|||||||
|
|
||||||
onContainerContextMenu = (event) => {
|
onContainerContextMenu = (event) => {
|
||||||
if (this.props.selectedDirentList.length === 0) {
|
if (this.props.selectedDirentList.length === 0) {
|
||||||
let id = "dirent-container-menu"
|
let id = 'dirent-container-menu';
|
||||||
let menuList = [TextTranslation.NEW_FOLDER, TextTranslation.NEW_FILE];
|
let menuList = [TextTranslation.NEW_FOLDER, TextTranslation.NEW_FILE];
|
||||||
this.handleContextClick(event, id, menuList);
|
this.handleContextClick(event, id, menuList);
|
||||||
} else {
|
} else {
|
||||||
@@ -341,7 +343,7 @@ class DirentListView extends React.Component {
|
|||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
event.persist();
|
event.persist();
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
let id = "dirent-container-menu"
|
let id = 'dirent-container-menu';
|
||||||
let menuList = [TextTranslation.NEW_FOLDER, TextTranslation.NEW_FILE];
|
let menuList = [TextTranslation.NEW_FOLDER, TextTranslation.NEW_FILE];
|
||||||
this.handleContextClick(event, id, menuList);
|
this.handleContextClick(event, id, menuList);
|
||||||
}, 0);
|
}, 0);
|
||||||
@@ -539,7 +541,7 @@ class DirentListView extends React.Component {
|
|||||||
|
|
||||||
onTableDragLeave = (e) => {
|
onTableDragLeave = (e) => {
|
||||||
if (e.target.className === 'table-container table-drop-active') {
|
if (e.target.className === 'table-container table-drop-active') {
|
||||||
this.setState({isListDropTipShow: false})
|
this.setState({isListDropTipShow: false});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -558,7 +560,7 @@ class DirentListView extends React.Component {
|
|||||||
if (nodeRootPath === this.props.path || nodeParentPath === this.props.path) {
|
if (nodeRootPath === this.props.path || nodeParentPath === this.props.path) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
this.props.onItemMove(this.props.currentRepoInfo, nodeDirent, this.props.path, nodeParentPath)
|
this.props.onItemMove(this.props.currentRepoInfo, nodeDirent, this.props.path, nodeParentPath);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -158,7 +158,7 @@ class MarkdownViewerToolbar extends React.Component {
|
|||||||
}
|
}
|
||||||
{canGenerateShareLink &&
|
{canGenerateShareLink &&
|
||||||
<IconButton id={'shareBtn'} text={gettext('Share')} icon={'fa fa-share-alt'}
|
<IconButton id={'shareBtn'} text={gettext('Share')} icon={'fa fa-share-alt'}
|
||||||
onMouseDown={this.props.toggleShareLinkDialog}/>
|
onMouseDown={this.props.toggleShareLinkDialog}/>
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
this.props.showFileHistory && <IconButton id={'historyButton'}
|
this.props.showFileHistory && <IconButton id={'historyButton'}
|
||||||
|
@@ -18,12 +18,12 @@ const propTypes = {
|
|||||||
freezeItem: PropTypes.func.isRequired,
|
freezeItem: PropTypes.func.isRequired,
|
||||||
unfreezeItem: PropTypes.func.isRequired,
|
unfreezeItem: PropTypes.func.isRequired,
|
||||||
onMenuItemClick: PropTypes.func,
|
onMenuItemClick: PropTypes.func,
|
||||||
registerHandlers: PropTypes.func,
|
|
||||||
unregisterHandlers: PropTypes.func,
|
|
||||||
onNodeDragMove: PropTypes.func,
|
onNodeDragMove: PropTypes.func,
|
||||||
onNodeDrop: PropTypes.func,
|
onNodeDrop: PropTypes.func,
|
||||||
appMenuType: PropTypes.oneOf(['list_view_contextmenu', 'item_contextmenu', 'tree_contextmenu', 'item_op_menu']),
|
appMenuType: PropTypes.oneOf(['list_view_contextmenu', 'item_contextmenu', 'tree_contextmenu', 'item_op_menu']),
|
||||||
handleContextClick: PropTypes.func.isRequired,
|
handleContextClick: PropTypes.func.isRequired,
|
||||||
|
onNodeDragEnter: PropTypes.func.isRequired,
|
||||||
|
onNodeDragLeave:PropTypes.func.isRequired,
|
||||||
};
|
};
|
||||||
|
|
||||||
class TreeNodeView extends React.Component {
|
class TreeNodeView extends React.Component {
|
||||||
@@ -202,9 +202,6 @@ class TreeNodeView extends React.Component {
|
|||||||
freezeItem={this.props.freezeItem}
|
freezeItem={this.props.freezeItem}
|
||||||
onMenuItemClick={this.props.onMenuItemClick}
|
onMenuItemClick={this.props.onMenuItemClick}
|
||||||
unfreezeItem={this.unfreezeItem}
|
unfreezeItem={this.unfreezeItem}
|
||||||
onNodeChanged={this.props.onNodeChanged}
|
|
||||||
registerHandlers={this.props.registerHandlers}
|
|
||||||
unregisterHandlers={this.props.unregisterHandlers}
|
|
||||||
onNodeDragStart={this.props.onNodeDragStart}
|
onNodeDragStart={this.props.onNodeDragStart}
|
||||||
onNodeDragMove={this.props.onNodeDragMove}
|
onNodeDragMove={this.props.onNodeDragMove}
|
||||||
onNodeDrop={this.props.onNodeDrop}
|
onNodeDrop={this.props.onNodeDrop}
|
||||||
|
@@ -39,16 +39,16 @@ class TreeView extends React.Component {
|
|||||||
let dragStartNodeData = {nodeDirent: node.object, nodeParentPath: node.parentNode.path, nodeRootPath: node.path};
|
let dragStartNodeData = {nodeDirent: node.object, nodeParentPath: node.parentNode.path, nodeRootPath: node.path};
|
||||||
dragStartNodeData = JSON.stringify(dragStartNodeData);
|
dragStartNodeData = JSON.stringify(dragStartNodeData);
|
||||||
|
|
||||||
e.dataTransfer.effectAllowed = "move";
|
e.dataTransfer.effectAllowed = 'move';
|
||||||
e.dataTransfer.setData('applicaiton/drag-item-info', dragStartNodeData);
|
e.dataTransfer.setData('applicaiton/drag-item-info', dragStartNodeData);
|
||||||
}
|
}
|
||||||
|
|
||||||
onNodeDragEnter = (e, node) => {
|
onNodeDragEnter = (e, node) => {
|
||||||
e.persist()
|
e.persist();
|
||||||
if (e.target.className === 'tree-view tree ') {
|
if (e.target.className === 'tree-view tree ') {
|
||||||
this.setState({
|
this.setState({
|
||||||
isTreeViewDropTipShow: true,
|
isTreeViewDropTipShow: true,
|
||||||
})
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -61,7 +61,7 @@ class TreeView extends React.Component {
|
|||||||
if (e.target.className === 'tree-view tree tree-view-drop') {
|
if (e.target.className === 'tree-view tree tree-view-drop') {
|
||||||
this.setState({
|
this.setState({
|
||||||
isTreeViewDropTipShow: false,
|
isTreeViewDropTipShow: false,
|
||||||
})
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -154,10 +154,10 @@ class TreeView extends React.Component {
|
|||||||
let y = event.clientY || (event.touches && event.touches[0].pageY);
|
let y = event.clientY || (event.touches && event.touches[0].pageY);
|
||||||
|
|
||||||
if (this.props.posX) {
|
if (this.props.posX) {
|
||||||
x -= this.props.posX;
|
x -= this.props.posX;
|
||||||
}
|
}
|
||||||
if (this.props.posY) {
|
if (this.props.posY) {
|
||||||
y -= this.props.posY;
|
y -= this.props.posY;
|
||||||
}
|
}
|
||||||
|
|
||||||
hideMenu();
|
hideMenu();
|
||||||
|
@@ -86,6 +86,7 @@ const propTypes = {
|
|||||||
onDeleteRepoTag: PropTypes.func.isRequired,
|
onDeleteRepoTag: PropTypes.func.isRequired,
|
||||||
updateDetail: PropTypes.bool.isRequired,
|
updateDetail: PropTypes.bool.isRequired,
|
||||||
onListContainerScroll: PropTypes.func.isRequired,
|
onListContainerScroll: PropTypes.func.isRequired,
|
||||||
|
onDirentClick: PropTypes.func.isRequired,
|
||||||
};
|
};
|
||||||
|
|
||||||
class LibContentContainer extends React.Component {
|
class LibContentContainer extends React.Component {
|
||||||
|
@@ -196,20 +196,20 @@ class LibContentView extends React.Component {
|
|||||||
|
|
||||||
if (this.state.currentMode === 'column') {
|
if (this.state.currentMode === 'column') {
|
||||||
if (this.state.isViewFile) {
|
if (this.state.isViewFile) {
|
||||||
this.updataColumnMarkdownData(path)
|
this.updataColumnMarkdownData(path);
|
||||||
} else {
|
} else {
|
||||||
seafileAPI.dirMetaData(repoID, path).then((res) => {
|
seafileAPI.dirMetaData(repoID, path).then((res) => {
|
||||||
if (res.data.id !== dirID) {
|
if (res.data.id !== dirID) {
|
||||||
this.loadDirentList(path);
|
this.loadDirentList(path);
|
||||||
}
|
}
|
||||||
})
|
});
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
seafileAPI.dirMetaData(repoID, path).then((res) => {
|
seafileAPI.dirMetaData(repoID, path).then((res) => {
|
||||||
if (res.data.id !== dirID) {
|
if (res.data.id !== dirID) {
|
||||||
this.loadDirentList(path);
|
this.loadDirentList(path);
|
||||||
}
|
}
|
||||||
})
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -252,7 +252,7 @@ class LibContentView extends React.Component {
|
|||||||
seafileAPI.getFileDownloadLink(repoID, filePath).then((res) => {
|
seafileAPI.getFileDownloadLink(repoID, filePath).then((res) => {
|
||||||
seafileAPI.getFileContent(res.data).then((res) => {
|
seafileAPI.getFileContent(res.data).then((res) => {
|
||||||
if (this.state.content !== res.data) {
|
if (this.state.content !== res.data) {
|
||||||
this.setState({isFileLoading: true})
|
this.setState({isFileLoading: true});
|
||||||
}
|
}
|
||||||
this.setState({
|
this.setState({
|
||||||
content: res.data,
|
content: res.data,
|
||||||
@@ -419,7 +419,7 @@ class LibContentView extends React.Component {
|
|||||||
toaster.danger(
|
toaster.danger(
|
||||||
<SessionExpiredTip />,
|
<SessionExpiredTip />,
|
||||||
{id: 'session_expired', duration: 3600}
|
{id: 'session_expired', duration: 3600}
|
||||||
)
|
);
|
||||||
}
|
}
|
||||||
this.setState({
|
this.setState({
|
||||||
isFileLoading: false,
|
isFileLoading: false,
|
||||||
@@ -466,8 +466,8 @@ class LibContentView extends React.Component {
|
|||||||
toaster.danger(
|
toaster.danger(
|
||||||
<SessionExpiredTip />,
|
<SessionExpiredTip />,
|
||||||
{id: 'session_expired', duration: 3600}
|
{id: 'session_expired', duration: 3600}
|
||||||
)
|
);
|
||||||
this.setState({isDirentListLoading: false})
|
this.setState({isDirentListLoading: false});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
this.setState({
|
this.setState({
|
||||||
@@ -1416,7 +1416,7 @@ class LibContentView extends React.Component {
|
|||||||
|
|
||||||
let direntItemsList = this.state.direntList.filter((item, index) => {
|
let direntItemsList = this.state.direntList.filter((item, index) => {
|
||||||
return index < this.state.itemsShowLength;
|
return index < this.state.itemsShowLength;
|
||||||
})
|
});
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="main-panel o-hidden">
|
<div className="main-panel o-hidden">
|
||||||
|
Reference in New Issue
Block a user