mirror of
https://github.com/haiwen/seahub.git
synced 2025-09-07 18:03:48 +00:00
Active item improve (#3258)
* optimized code * add active interaction * repair interactive bug
This commit is contained in:
@@ -61,7 +61,6 @@ const propTypes = {
|
|||||||
onItemRename: PropTypes.func.isRequired,
|
onItemRename: PropTypes.func.isRequired,
|
||||||
onItemMove: PropTypes.func.isRequired,
|
onItemMove: PropTypes.func.isRequired,
|
||||||
onItemCopy: PropTypes.func.isRequired,
|
onItemCopy: PropTypes.func.isRequired,
|
||||||
onItemDetails: PropTypes.func.isRequired,
|
|
||||||
onDirentClick: PropTypes.func.isRequired,
|
onDirentClick: PropTypes.func.isRequired,
|
||||||
isAllItemSelected: PropTypes.bool.isRequired,
|
isAllItemSelected: PropTypes.bool.isRequired,
|
||||||
onAllItemSelected: PropTypes.func.isRequired,
|
onAllItemSelected: PropTypes.func.isRequired,
|
||||||
@@ -218,7 +217,6 @@ class DirColumnView extends React.Component {
|
|||||||
onItemMove={this.props.onItemMove}
|
onItemMove={this.props.onItemMove}
|
||||||
onItemCopy={this.props.onItemCopy}
|
onItemCopy={this.props.onItemCopy}
|
||||||
onDirentClick={this.props.onDirentClick}
|
onDirentClick={this.props.onDirentClick}
|
||||||
onItemDetails={this.props.onItemDetails}
|
|
||||||
updateDirent={this.props.updateDirent}
|
updateDirent={this.props.updateDirent}
|
||||||
isAllItemSelected={this.props.isAllItemSelected}
|
isAllItemSelected={this.props.isAllItemSelected}
|
||||||
onAllItemSelected={this.props.onAllItemSelected}
|
onAllItemSelected={this.props.onAllItemSelected}
|
||||||
|
@@ -6,7 +6,6 @@ import { Utils } from '../../utils/utils';
|
|||||||
import EditFileTagDialog from '../dialog/edit-filetag-dialog';
|
import EditFileTagDialog from '../dialog/edit-filetag-dialog';
|
||||||
import ModalPortal from '../modal-portal';
|
import ModalPortal from '../modal-portal';
|
||||||
import RelatedFileDialogs from '../dialog/related-file-dialogs';
|
import RelatedFileDialogs from '../dialog/related-file-dialogs';
|
||||||
import { seafileAPI } from '../../utils/seafile-api';
|
|
||||||
|
|
||||||
const propTypes = {
|
const propTypes = {
|
||||||
repoInfo: PropTypes.object.isRequired,
|
repoInfo: PropTypes.object.isRequired,
|
||||||
@@ -28,7 +27,6 @@ class DetailListView extends React.Component {
|
|||||||
this.state = {
|
this.state = {
|
||||||
isEditFileTagShow: false,
|
isEditFileTagShow: false,
|
||||||
showRelatedFileDialog: false,
|
showRelatedFileDialog: false,
|
||||||
repo: {},
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -72,28 +70,6 @@ class DetailListView extends React.Component {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
getRepoInfo = (repoID) => {
|
|
||||||
seafileAPI.listRepos({type: 'mine'}).then((res) => {
|
|
||||||
let repoList = res.data.repos;
|
|
||||||
for (let i = 0, length = repoList.length; i < length; i++) {
|
|
||||||
if (repoList[i].repo_id === repoID) {
|
|
||||||
this.setState({ repo: repoList[i] });
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
componentDidMount() {
|
|
||||||
this.getRepoInfo(this.props.repoID);
|
|
||||||
}
|
|
||||||
|
|
||||||
componentWillReceiveProps(nextProps) {
|
|
||||||
if (nextProps.repoID !== this.props.repoID) {
|
|
||||||
this.getRepoInfo(nextProps.repoID);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
let { direntType, direntDetail, fileTagList, relatedFiles } = this.props;
|
let { direntType, direntDetail, fileTagList, relatedFiles } = this.props;
|
||||||
let position = this.getDirentPostion();
|
let position = this.getDirentPostion();
|
||||||
@@ -110,20 +86,6 @@ class DetailListView extends React.Component {
|
|||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
);
|
);
|
||||||
} else if (direntType === 'repo') {
|
|
||||||
const repoInfo = this.props.repoInfo;
|
|
||||||
return (
|
|
||||||
<table className="table-thead-hidden">
|
|
||||||
<thead>
|
|
||||||
<tr><th width="35%"></th><th width="65%"></th></tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
<tr><th>{gettext('File Count')}</th><td>{repoInfo.file_count}</td></tr>
|
|
||||||
<tr><th>{gettext('Size')}</th><td>{repoInfo.size}</td></tr>
|
|
||||||
<tr><th>{gettext('Last Update')}</th><td>{moment(this.state.repo.last_modified).format('YYYY-MM-DD')}</td></tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
);
|
|
||||||
} else {
|
} else {
|
||||||
return (
|
return (
|
||||||
<Fragment>
|
<Fragment>
|
||||||
|
@@ -4,14 +4,14 @@ import { Utils } from '../../utils/utils';
|
|||||||
import { seafileAPI } from '../../utils/seafile-api';
|
import { seafileAPI } from '../../utils/seafile-api';
|
||||||
import Dirent from '../../models/dirent';
|
import Dirent from '../../models/dirent';
|
||||||
import DetailListView from './detail-list-view';
|
import DetailListView from './detail-list-view';
|
||||||
import RepoInfo from '../../models/repo-info';
|
|
||||||
import FileTag from '../../models/file-tag';
|
import FileTag from '../../models/file-tag';
|
||||||
import '../../css/dirent-detail.css';
|
import '../../css/dirent-detail.css';
|
||||||
|
|
||||||
const propTypes = {
|
const propTypes = {
|
||||||
repoID: PropTypes.string.isRequired,
|
repoID: PropTypes.string.isRequired,
|
||||||
dirent: PropTypes.object.isRequired,
|
dirent: PropTypes.object,
|
||||||
path: PropTypes.string.isRequired,
|
path: PropTypes.string.isRequired,
|
||||||
|
currentRepoInfo: PropTypes.object.isRequired,
|
||||||
onItemDetailsClose: PropTypes.func.isRequired,
|
onItemDetailsClose: PropTypes.func.isRequired,
|
||||||
onFileTagChanged: PropTypes.func.isRequired,
|
onFileTagChanged: PropTypes.func.isRequired,
|
||||||
};
|
};
|
||||||
@@ -23,38 +23,48 @@ class DirentDetail extends React.Component {
|
|||||||
this.state = {
|
this.state = {
|
||||||
direntType: '',
|
direntType: '',
|
||||||
direntDetail: '',
|
direntDetail: '',
|
||||||
repoInfo: null,
|
|
||||||
fileTagList: [],
|
fileTagList: [],
|
||||||
relatedFiles: [],
|
relatedFiles: [],
|
||||||
currentFolderDirent: null,
|
folderDirent: null,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
componentWillMount() {
|
|
||||||
if (!this.props.dirent.name) {
|
|
||||||
this.getCurrentFolderDirent();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
componentDidMount() {
|
componentDidMount() {
|
||||||
let { dirent, path, repoID } = this.props;
|
let { dirent, path, repoID } = this.props;
|
||||||
let direntPath = Utils.joinPath(path, dirent.name);
|
this.loadDirentInfo(dirent, path, repoID);
|
||||||
seafileAPI.getRepoInfo(repoID).then(res => {
|
|
||||||
let repoInfo = new RepoInfo(res.data);
|
|
||||||
this.setState({repoInfo: repoInfo});
|
|
||||||
this.updateDetailView(dirent, direntPath);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
componentWillReceiveProps(nextProps) {
|
componentWillReceiveProps(nextProps) {
|
||||||
let { dirent, path } = nextProps;
|
let { dirent, path, repoID } = nextProps;
|
||||||
|
this.loadDirentInfo(dirent, path, repoID);
|
||||||
|
}
|
||||||
|
|
||||||
|
loadDirentInfo = (dirent, path, repoID) => {
|
||||||
|
if (dirent) {
|
||||||
let direntPath = Utils.joinPath(path, dirent.name);
|
let direntPath = Utils.joinPath(path, dirent.name);
|
||||||
this.updateDetailView(dirent, direntPath);
|
this.updateDetailView(dirent, direntPath);
|
||||||
|
} else {
|
||||||
|
let dirPath = Utils.getDirName(path);
|
||||||
|
seafileAPI.listDir(repoID, dirPath).then(res => {
|
||||||
|
let direntList = res.data.dirent_list;
|
||||||
|
let folderDirent = null;
|
||||||
|
for (let i = 0; i < direntList.length; i++) {
|
||||||
|
let dirent = direntList[i];
|
||||||
|
if (dirent.parent_dir + dirent.name === path) {
|
||||||
|
folderDirent = new Dirent(dirent);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
this.setState({folderDirent: folderDirent});
|
||||||
|
this.updateDetailView(folderDirent, path);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
updateDetailView = (dirent, direntPath) => {
|
updateDetailView = (dirent, direntPath) => {
|
||||||
let repoID = this.props.repoID;
|
let repoID = this.props.repoID;
|
||||||
if (dirent && dirent.type === 'file') {
|
if (dirent.type === 'file') {
|
||||||
seafileAPI.getFileInfo(repoID, direntPath).then(res => {
|
seafileAPI.getFileInfo(repoID, direntPath).then(res => {
|
||||||
this.setState({
|
this.setState({
|
||||||
direntType: 'file',
|
direntType: 'file',
|
||||||
@@ -84,49 +94,16 @@ class DirentDetail extends React.Component {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} else if (this.props.path !== '/') {
|
} else {
|
||||||
const dirPath = dirent.name ? direntPath : this.props.path;
|
|
||||||
seafileAPI.getDirInfo(repoID, dirPath).then(res => {
|
|
||||||
this.setState({
|
|
||||||
direntType: 'dir',
|
|
||||||
direntDetail: res.data
|
|
||||||
});
|
|
||||||
});
|
|
||||||
} else if (this.props.path === '/' && dirent.name) {
|
|
||||||
seafileAPI.getDirInfo(repoID, direntPath).then(res => {
|
seafileAPI.getDirInfo(repoID, direntPath).then(res => {
|
||||||
this.setState({
|
this.setState({
|
||||||
direntType: 'dir',
|
direntType: 'dir',
|
||||||
direntDetail: res.data
|
direntDetail: res.data
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
} else if (this.props.path === '/' && !dirent.name) {
|
|
||||||
this.setState({
|
|
||||||
direntType: 'repo',
|
|
||||||
direntDetail: {},
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
getCurrentFolderDirent = () => {
|
|
||||||
const path = this.props.path;
|
|
||||||
const parentPath = path.slice(0, path.lastIndexOf('/'));
|
|
||||||
seafileAPI.listDir(this.props.repoID, parentPath).then(res => {
|
|
||||||
try {
|
|
||||||
res.data.dirent_list.forEach((dirent) => {
|
|
||||||
if ((dirent.parent_dir + dirent.name) === path) throw dirent;
|
|
||||||
});
|
|
||||||
} catch (dirent) {
|
|
||||||
let dirent = new Dirent(dirent);
|
|
||||||
this.setState({ currentFolderDirent: dirent });
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
onFileTagChanged = (dirent, direntPath) => {
|
|
||||||
this.updateDetailView(dirent, direntPath);
|
|
||||||
this.props.onFileTagChanged(dirent, direntPath);
|
|
||||||
}
|
|
||||||
|
|
||||||
onRelatedFileChange = () => {
|
onRelatedFileChange = () => {
|
||||||
let { dirent, path } = this.props;
|
let { dirent, path } = this.props;
|
||||||
let direntPath = Utils.joinPath(path, dirent.name);
|
let direntPath = Utils.joinPath(path, dirent.name);
|
||||||
@@ -134,27 +111,16 @@ class DirentDetail extends React.Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
let { dirent, path, currentRepoInfo } = this.props;
|
let { dirent } = this.props;
|
||||||
let smallIconUrl, bigIconUrl, direntName;
|
let { folderDirent } = this.state;
|
||||||
let folderDirent = this.state.currentFolderDirent;
|
if (!dirent && !folderDirent) {
|
||||||
|
return '';
|
||||||
if (dirent.name) {
|
|
||||||
// selected something
|
|
||||||
smallIconUrl = Utils.getDirentIcon(dirent);
|
|
||||||
bigIconUrl = Utils.getDirentIcon(dirent, true);
|
|
||||||
direntName = dirent.name;
|
|
||||||
} else if (!dirent.name && path === '/') {
|
|
||||||
// seleted nothing and parent is repo
|
|
||||||
smallIconUrl = Utils.getLibIconUrl(currentRepoInfo);
|
|
||||||
bigIconUrl = Utils.getLibIconUrl(currentRepoInfo, true);
|
|
||||||
direntName = currentRepoInfo.repo_name;
|
|
||||||
} else if (!dirent.name && path !== '/') {
|
|
||||||
// select nothing and parent is folder
|
|
||||||
smallIconUrl = folderDirent && Utils.getDirentIcon(folderDirent);
|
|
||||||
bigIconUrl = folderDirent && Utils.getDirentIcon(folderDirent, true);
|
|
||||||
direntName = folderDirent && folderDirent.name;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let smallIconUrl = dirent ? Utils.getDirentIcon(dirent) : Utils.getDirentIcon(folderDirent);
|
||||||
|
let bigIconUrl = dirent ? Utils.getDirentIcon(dirent, true) : Utils.getDirentIcon(folderDirent, true);
|
||||||
|
let direntName = dirent ? dirent.name : folderDirent.name;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="detail-container">
|
<div className="detail-container">
|
||||||
<div className="detail-header">
|
<div className="detail-header">
|
||||||
@@ -171,7 +137,7 @@ class DirentDetail extends React.Component {
|
|||||||
{this.state.direntDetail &&
|
{this.state.direntDetail &&
|
||||||
<div className="dirent-table-container">
|
<div className="dirent-table-container">
|
||||||
<DetailListView
|
<DetailListView
|
||||||
repoInfo={this.state.repoInfo}
|
repoInfo={this.props.currentRepoInfo}
|
||||||
path={this.props.path}
|
path={this.props.path}
|
||||||
repoID={this.props.repoID}
|
repoID={this.props.repoID}
|
||||||
dirent={this.props.dirent || folderDirent}
|
dirent={this.props.dirent || folderDirent}
|
||||||
@@ -179,7 +145,7 @@ class DirentDetail extends React.Component {
|
|||||||
direntDetail={this.state.direntDetail}
|
direntDetail={this.state.direntDetail}
|
||||||
fileTagList={this.state.fileTagList}
|
fileTagList={this.state.fileTagList}
|
||||||
relatedFiles={this.state.relatedFiles}
|
relatedFiles={this.state.relatedFiles}
|
||||||
onFileTagChanged={this.onFileTagChanged}
|
onFileTagChanged={this.props.onFileTagChanged}
|
||||||
onRelatedFileChange={this.onRelatedFileChange}
|
onRelatedFileChange={this.onRelatedFileChange}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
@@ -41,6 +41,7 @@ const propTypes = {
|
|||||||
isGroupOwnedRepo: PropTypes.bool.isRequired,
|
isGroupOwnedRepo: PropTypes.bool.isRequired,
|
||||||
onItemMouseDown: PropTypes.func.isRequired,
|
onItemMouseDown: PropTypes.func.isRequired,
|
||||||
onItemContextMenu: PropTypes.func.isRequired,
|
onItemContextMenu: PropTypes.func.isRequired,
|
||||||
|
selectedDirentList: PropTypes.array.isRequired
|
||||||
};
|
};
|
||||||
|
|
||||||
class DirentListItem extends React.Component {
|
class DirentListItem extends React.Component {
|
||||||
@@ -102,13 +103,6 @@ class DirentListItem extends React.Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
onUnfreezedItem = () => {
|
onUnfreezedItem = () => {
|
||||||
let dirent = this.props.dirent;
|
|
||||||
// scenes 1: dirent isSelected --> this have Highest level
|
|
||||||
// scenes 2: dirent contextmenu show
|
|
||||||
// scenes 3: dirent operation menu show
|
|
||||||
if (dirent.isSelected) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
this.setState({
|
this.setState({
|
||||||
highlight: false,
|
highlight: false,
|
||||||
isOperationShow: false,
|
isOperationShow: false,
|
||||||
@@ -118,7 +112,6 @@ class DirentListItem extends React.Component {
|
|||||||
|
|
||||||
//buiness handler
|
//buiness handler
|
||||||
onItemSelected = () => {
|
onItemSelected = () => {
|
||||||
this.props.onFreezedItem();
|
|
||||||
this.props.onItemSelected(this.props.dirent);
|
this.props.onItemSelected(this.props.dirent);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -389,7 +382,7 @@ class DirentListItem extends React.Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
let { path, dirent } = this.props;
|
let { path, dirent, selectedDirentList } = this.props;
|
||||||
let direntPath = Utils.joinPath(path, dirent.name);
|
let direntPath = Utils.joinPath(path, dirent.name);
|
||||||
let dirHref = '';
|
let dirHref = '';
|
||||||
if (this.props.currentRepoInfo) {
|
if (this.props.currentRepoInfo) {
|
||||||
@@ -408,6 +401,7 @@ class DirentListItem extends React.Component {
|
|||||||
|
|
||||||
let trClass = this.state.highlight ? 'tr-highlight ' : '';
|
let trClass = this.state.highlight ? 'tr-highlight ' : '';
|
||||||
trClass += this.state.isDropTipshow ? 'tr-drop-effect' : '';
|
trClass += this.state.isDropTipshow ? 'tr-drop-effect' : '';
|
||||||
|
trClass += dirent.isSelected ? 'tr-active' : '';
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Fragment>
|
<Fragment>
|
||||||
@@ -466,8 +460,9 @@ class DirentListItem extends React.Component {
|
|||||||
)}
|
)}
|
||||||
</td>
|
</td>
|
||||||
<td className="operation">
|
<td className="operation">
|
||||||
{
|
{selectedDirentList.length > 1 ?
|
||||||
this.state.isOperationShow &&
|
<Fragment>
|
||||||
|
{this.state.isOperationShow && !dirent.isSelected &&
|
||||||
<div className="operations">
|
<div className="operations">
|
||||||
<ul className="operation-group">
|
<ul className="operation-group">
|
||||||
<li className="operation-group-item">
|
<li className="operation-group-item">
|
||||||
@@ -494,6 +489,37 @@ class DirentListItem extends React.Component {
|
|||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
|
</Fragment> :
|
||||||
|
<Fragment>
|
||||||
|
{this.state.isOperationShow &&
|
||||||
|
<div className="operations">
|
||||||
|
<ul className="operation-group">
|
||||||
|
<li className="operation-group-item">
|
||||||
|
<i className="op-icon sf2-icon-download" title={gettext('Download')} onClick={this.onItemDownload}></i>
|
||||||
|
</li>
|
||||||
|
{this.props.showShareBtn &&
|
||||||
|
<li className="operation-group-item">
|
||||||
|
<i className="op-icon sf2-icon-share" title={gettext('Share')} onClick={this.onItemShare}></i>
|
||||||
|
</li>
|
||||||
|
}
|
||||||
|
<li className="operation-group-item">
|
||||||
|
<i className="op-icon sf2-icon-delete" title={gettext('Delete')} onClick={this.onItemDelete}></i>
|
||||||
|
</li>
|
||||||
|
<li className="operation-group-item">
|
||||||
|
<DirentMenu
|
||||||
|
dirent={this.props.dirent}
|
||||||
|
onMenuItemClick={this.onMenuItemClick}
|
||||||
|
currentRepoInfo={this.props.currentRepoInfo}
|
||||||
|
isRepoOwner={this.props.isRepoOwner}
|
||||||
|
onFreezedItem={this.props.onFreezedItem}
|
||||||
|
onUnfreezedItem={this.onUnfreezedItem}
|
||||||
|
/>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
</Fragment>
|
||||||
|
}
|
||||||
</td>
|
</td>
|
||||||
<td className="file-size">{dirent.size && dirent.size}</td>
|
<td className="file-size">{dirent.size && dirent.size}</td>
|
||||||
<td className="last-update">{dirent.mtime_relative}</td>
|
<td className="last-update">{dirent.mtime_relative}</td>
|
||||||
|
@@ -101,10 +101,6 @@ class DirentListView extends React.Component {
|
|||||||
this.onFreezedItem();
|
this.onFreezedItem();
|
||||||
}
|
}
|
||||||
|
|
||||||
onItemDetails = (dirent) => {
|
|
||||||
this.props.onItemDetails(dirent);
|
|
||||||
}
|
|
||||||
|
|
||||||
sortByName = (e) => {
|
sortByName = (e) => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
const sortBy = 'name';
|
const sortBy = 'name';
|
||||||
@@ -174,9 +170,7 @@ class DirentListView extends React.Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
closeImagePopup = () => {
|
closeImagePopup = () => {
|
||||||
this.setState({
|
this.setState({isImagePopupOpen: false});
|
||||||
isImagePopupOpen: false
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
onCreateFileToggle = () => {
|
onCreateFileToggle = () => {
|
||||||
@@ -395,10 +389,8 @@ class DirentListView extends React.Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
onHideMenu = (e) => {
|
onHideMenu = (e) => {
|
||||||
if (this.props.selectedDirentList.length === 0) {
|
|
||||||
this.onUnfreezedItem();
|
this.onUnfreezedItem();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// contextmenu utils
|
// contextmenu utils
|
||||||
getDirentIndex = (dirent) => {
|
getDirentIndex = (dirent) => {
|
||||||
@@ -545,10 +537,10 @@ class DirentListView extends React.Component {
|
|||||||
onFreezedItem={this.onFreezedItem}
|
onFreezedItem={this.onFreezedItem}
|
||||||
onUnfreezedItem={this.onUnfreezedItem}
|
onUnfreezedItem={this.onUnfreezedItem}
|
||||||
onDirentClick={this.props.onDirentClick}
|
onDirentClick={this.props.onDirentClick}
|
||||||
onItemDetails={this.onItemDetails}
|
|
||||||
showImagePopup={this.showImagePopup}
|
showImagePopup={this.showImagePopup}
|
||||||
onItemMouseDown={this.onItemMouseDown}
|
onItemMouseDown={this.onItemMouseDown}
|
||||||
onItemContextMenu={this.onItemContextMenu}
|
onItemContextMenu={this.onItemContextMenu}
|
||||||
|
selectedDirentList={this.props.selectedDirentList}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
})}
|
})}
|
||||||
|
@@ -1,14 +1,15 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
|
import { DropdownMenu, DropdownToggle, DropdownItem, ButtonDropdown } from 'reactstrap';
|
||||||
import { Utils } from '../../utils/utils';
|
import { Utils } from '../../utils/utils';
|
||||||
import { Dropdown, DropdownMenu, DropdownToggle, DropdownItem, ButtonDropdown } from 'reactstrap';
|
import { gettext, isPro } from '../../utils/constants';
|
||||||
import { gettext, isPro, enableFileComment, fileAuditEnabled, folderPermEnabled } from '../../utils/constants';
|
import TextTranslation from '../../utils/text-translation';
|
||||||
|
|
||||||
import '../../css/dirents-menu.css';
|
import '../../css/dirents-menu.css';
|
||||||
|
|
||||||
const propTypes = {
|
const propTypes = {
|
||||||
dirents: PropTypes.array.isRequired,
|
dirent: PropTypes.object.isRequired,
|
||||||
currentRepoInfo: PropTypes.object.isRequired,
|
currentRepoInfo: PropTypes.object.isRequired,
|
||||||
isRepoOwner: PropTypes.bool.isRequired,
|
|
||||||
onMenuItemClick: PropTypes.func.isRequired,
|
onMenuItemClick: PropTypes.func.isRequired,
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -22,65 +23,43 @@ class DirentMenu extends React.Component {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
calculateMenuList(props) {
|
componentDidMount() {
|
||||||
const { currentRepoInfo, dirents, isRepoOwner } = props;
|
const { currentRepoInfo, dirent } = this.props;
|
||||||
const length = dirents.length;
|
let menuList = this.calculateMenuList(currentRepoInfo, dirent);
|
||||||
|
this.setState({menuList: menuList});
|
||||||
|
}
|
||||||
|
|
||||||
|
componentWillReceiveProps(nextProps) {
|
||||||
|
const { currentRepoInfo, dirent } = nextProps;
|
||||||
|
let menuList = this.calculateMenuList(currentRepoInfo, dirent);
|
||||||
|
this.setState({menuList: menuList});
|
||||||
|
}
|
||||||
|
|
||||||
|
calculateMenuList(currentRepoInfo, dirent) {
|
||||||
let menuList = [];
|
let menuList = [];
|
||||||
if (length === 1) {
|
const { SHARE, TAGS, RELATED_FILES, HISTORY, OPEN_VIA_CLIENT, LOCK, UNLOCK } = TextTranslation;
|
||||||
const dirent = dirents[0];
|
|
||||||
if (dirent.type === 'dir') {
|
if (dirent.type === 'dir') {
|
||||||
menuList = ['Share'];
|
menuList = [SHARE];
|
||||||
} else if (dirent.type === 'file') {
|
return menuList;
|
||||||
menuList = ['Share', 'Tags', 'Related Files', 'Divider', 'History', 'Divider', 'Open via Client'];
|
}
|
||||||
|
|
||||||
|
if (dirent.type === 'file') {
|
||||||
|
menuList = [SHARE, TAGS, RELATED_FILES, 'Divider', HISTORY, 'Divider', OPEN_VIA_CLIENT];
|
||||||
if (!Utils.isMarkdownFile(dirent.name)) {
|
if (!Utils.isMarkdownFile(dirent.name)) {
|
||||||
menuList.splice(2, 1);
|
menuList.splice(2, 1);
|
||||||
}
|
}
|
||||||
if (isPro) {
|
if (isPro) {
|
||||||
if (dirent.is_locked) {
|
if (dirent.is_locked) {
|
||||||
if (dirent.locked_by_me || (dirent.lock_owner === 'OnlineOffice' && currentRepoInfo.permission === 'rw')) {
|
if (dirent.locked_by_me || (dirent.lock_owner === 'OnlineOffice' && currentRepoInfo.permission === 'rw')) {
|
||||||
menuList.splice(1, 0, 'Unlock');
|
menuList.splice(1, 0, UNLOCK);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
menuList.splice(1, 0, 'Lock');
|
menuList.splice(1, 0, LOCK);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return menuList;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
menuList = [];
|
|
||||||
}
|
|
||||||
this.setState({
|
|
||||||
menuList: menuList,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
translateMenuItem = (menuItem) => {
|
|
||||||
let translateResult = '';
|
|
||||||
switch (menuItem) {
|
|
||||||
case 'Share':
|
|
||||||
translateResult = gettext('Share');
|
|
||||||
break;
|
|
||||||
case 'Tags':
|
|
||||||
translateResult = gettext('Tags');
|
|
||||||
break;
|
|
||||||
case 'Lock':
|
|
||||||
translateResult = gettext('Lock');
|
|
||||||
break;
|
|
||||||
case 'Unlock':
|
|
||||||
translateResult = gettext('Unlock');
|
|
||||||
break;
|
|
||||||
case 'Related Files':
|
|
||||||
translateResult = gettext('Related Files');
|
|
||||||
break;
|
|
||||||
case 'History':
|
|
||||||
translateResult = gettext('History');
|
|
||||||
break;
|
|
||||||
case 'Open via Client':
|
|
||||||
translateResult = gettext('Open via Client');
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return translateResult;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
onDropdownToggleClick = (e) => {
|
onDropdownToggleClick = (e) => {
|
||||||
@@ -92,23 +71,11 @@ class DirentMenu extends React.Component {
|
|||||||
|
|
||||||
onMenuItemClick = (event) => {
|
onMenuItemClick = (event) => {
|
||||||
let operation = event.target.dataset.toggle;
|
let operation = event.target.dataset.toggle;
|
||||||
this.props.onMenuItemClick(operation, this.props.dirents);
|
this.props.onMenuItemClick(operation, this.props.dirent);
|
||||||
}
|
|
||||||
|
|
||||||
componentDidMount() {
|
|
||||||
this.calculateMenuList(this.props);
|
|
||||||
}
|
|
||||||
|
|
||||||
componentWillReceiveProps(nextProps) {
|
|
||||||
if (this.props.dirents.length !== nextProps.dirents.length) {
|
|
||||||
this.calculateMenuList(nextProps);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
if (this.state.menuList.length === 0) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return (
|
return (
|
||||||
<ButtonDropdown isOpen={this.state.isItemMenuShow} toggle={this.onDropdownToggleClick} title={gettext('More Operations')}>
|
<ButtonDropdown isOpen={this.state.isItemMenuShow} toggle={this.onDropdownToggleClick} title={gettext('More Operations')}>
|
||||||
<DropdownToggle data-toggle="dropdown" aria-expanded={this.state.isItemMenuShow} onClick={this.onDropdownToggleClick} className="fas fa-ellipsis-v sf-dropdown-toggle dirents-more-menu">
|
<DropdownToggle data-toggle="dropdown" aria-expanded={this.state.isItemMenuShow} onClick={this.onDropdownToggleClick} className="fas fa-ellipsis-v sf-dropdown-toggle dirents-more-menu">
|
||||||
@@ -119,7 +86,7 @@ class DirentMenu extends React.Component {
|
|||||||
return <DropdownItem key={index} divider/>;
|
return <DropdownItem key={index} divider/>;
|
||||||
} else {
|
} else {
|
||||||
return (
|
return (
|
||||||
<DropdownItem key={index} data-toggle={menuItem} onClick={this.onMenuItemClick}>{this.translateMenuItem(menuItem)}</DropdownItem>
|
<DropdownItem key={index} data-toggle={menuItem.key} onClick={this.onMenuItemClick}>{menuItem.value}</DropdownItem>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
})}
|
})}
|
||||||
|
@@ -28,7 +28,6 @@ const propTypes = {
|
|||||||
onFilesTagChanged: PropTypes.func.isRequired,
|
onFilesTagChanged: PropTypes.func.isRequired,
|
||||||
unSelectDirent: PropTypes.func.isRequired,
|
unSelectDirent: PropTypes.func.isRequired,
|
||||||
updateDirent: PropTypes.func.isRequired,
|
updateDirent: PropTypes.func.isRequired,
|
||||||
showDirentDetail: PropTypes.func.isRequired,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class MutipleDirOperationToolbar extends React.Component {
|
class MutipleDirOperationToolbar extends React.Component {
|
||||||
@@ -96,9 +95,6 @@ class MutipleDirOperationToolbar extends React.Component {
|
|||||||
case 'Tags':
|
case 'Tags':
|
||||||
this.listFileTags(dirent);
|
this.listFileTags(dirent);
|
||||||
break;
|
break;
|
||||||
case 'Details':
|
|
||||||
this.props.showDirentDetail();
|
|
||||||
break;
|
|
||||||
case 'Lock':
|
case 'Lock':
|
||||||
this.lockFile(dirent);
|
this.lockFile(dirent);
|
||||||
break;
|
break;
|
||||||
@@ -246,11 +242,10 @@ class MutipleDirOperationToolbar extends React.Component {
|
|||||||
<Button className="secondary group-op-item action-icon sf2-icon-copy" title={gettext('Copy')} onClick={this.onCopyToggle}></Button>
|
<Button className="secondary group-op-item action-icon sf2-icon-copy" title={gettext('Copy')} onClick={this.onCopyToggle}></Button>
|
||||||
<Button className="secondary group-op-item action-icon sf2-icon-delete" title={gettext('Delete')} onClick={this.onItemsDelete}></Button>
|
<Button className="secondary group-op-item action-icon sf2-icon-delete" title={gettext('Delete')} onClick={this.onItemsDelete}></Button>
|
||||||
<Button className="secondary group-op-item action-icon sf2-icon-download" title={gettext('Download')} onClick={this.onItemsDownload}></Button>
|
<Button className="secondary group-op-item action-icon sf2-icon-download" title={gettext('Download')} onClick={this.onItemsDownload}></Button>
|
||||||
{this.props.selectedDirentList.length > 0 &&
|
{this.props.selectedDirentList.length === 1 &&
|
||||||
<DirentsMenu
|
<DirentsMenu
|
||||||
dirents={this.props.selectedDirentList}
|
dirent={this.props.selectedDirentList[0]}
|
||||||
currentRepoInfo={this.props.currentRepoInfo}
|
currentRepoInfo={this.props.currentRepoInfo}
|
||||||
isRepoOwner={this.props.isRepoOwner}
|
|
||||||
onMenuItemClick={this.onMenuItemClick}
|
onMenuItemClick={this.onMenuItemClick}
|
||||||
/>
|
/>
|
||||||
}
|
}
|
||||||
|
@@ -3,6 +3,7 @@ import PropTypes from 'prop-types';
|
|||||||
import { gettext } from '../../utils/constants';
|
import { gettext } from '../../utils/constants';
|
||||||
import CurDirPath from '../../components/cur-dir-path';
|
import CurDirPath from '../../components/cur-dir-path';
|
||||||
import DirentDetail from '../../components/dirent-detail/dirent-details';
|
import DirentDetail from '../../components/dirent-detail/dirent-details';
|
||||||
|
import LibDetail from '../../components/dirent-detail/lib-details';
|
||||||
import DirListView from '../../components/dir-view-mode/dir-list-view';
|
import DirListView from '../../components/dir-view-mode/dir-list-view';
|
||||||
import DirGridView from '../../components/dir-view-mode/dir-grid-view';
|
import DirGridView from '../../components/dir-view-mode/dir-grid-view';
|
||||||
import DirColumnView from '../../components/dir-view-mode/dir-column-view';
|
import DirColumnView from '../../components/dir-view-mode/dir-column-view';
|
||||||
@@ -88,12 +89,18 @@ class LibContentContainer extends React.Component {
|
|||||||
constructor(props) {
|
constructor(props) {
|
||||||
super(props);
|
super(props);
|
||||||
this.state = {
|
this.state = {
|
||||||
currentDirent: {},
|
currentDirent: null,
|
||||||
};
|
};
|
||||||
|
|
||||||
this.errMessage = (<div className="message err-tip">{gettext('Folder does not exist.')}</div>);
|
this.errMessage = (<div className="message err-tip">{gettext('Folder does not exist.')}</div>);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
componentWillReceiveProps(nextProps) {
|
||||||
|
if (nextProps.path !== this.props.path) {
|
||||||
|
this.setState({currentDirent: null});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
onPathClick = (path) => {
|
onPathClick = (path) => {
|
||||||
this.props.onMainNavBarClick(path);
|
this.props.onMainNavBarClick(path);
|
||||||
this.props.closeDirentDetail();
|
this.props.closeDirentDetail();
|
||||||
@@ -106,33 +113,12 @@ class LibContentContainer extends React.Component {
|
|||||||
|
|
||||||
// on '<tr>'
|
// on '<tr>'
|
||||||
onDirentClick = (dirent) => {
|
onDirentClick = (dirent) => {
|
||||||
if (this.props.isDirentDetailShow) {
|
this.setState({currentDirent: dirent});
|
||||||
this.onItemDetails(dirent);
|
this.props.onDirentClick(dirent);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
onItemDetails = (dirent) => {
|
onItemSelected = (dirent) => {
|
||||||
this.setState({
|
this.setState({currentDirent: dirent});
|
||||||
currentDirent: dirent,
|
|
||||||
});
|
|
||||||
this.props.showDirentDetail();
|
|
||||||
}
|
|
||||||
|
|
||||||
onItemDetailsClose = () => {
|
|
||||||
this.props.closeDirentDetail();
|
|
||||||
}
|
|
||||||
|
|
||||||
componentWillReceiveProps (nextProps) {
|
|
||||||
if (nextProps.isDirentDetailShow) {
|
|
||||||
this.setState({
|
|
||||||
isDirentDetailShow: nextProps.isDirentDetailShow
|
|
||||||
});
|
|
||||||
}
|
|
||||||
if (nextProps.selectedDirent && nextProps.isDirentDetailShow) {
|
|
||||||
this.setState({
|
|
||||||
currentDirent: nextProps.selectedDirent,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
@@ -193,7 +179,6 @@ class LibContentContainer extends React.Component {
|
|||||||
onItemMove={this.props.onItemMove}
|
onItemMove={this.props.onItemMove}
|
||||||
onItemCopy={this.props.onItemCopy}
|
onItemCopy={this.props.onItemCopy}
|
||||||
onDirentClick={this.onDirentClick}
|
onDirentClick={this.onDirentClick}
|
||||||
onItemDetails={this.onItemDetails}
|
|
||||||
updateDirent={this.props.updateDirent}
|
updateDirent={this.props.updateDirent}
|
||||||
isAllItemSelected={this.props.isAllDirentSelected}
|
isAllItemSelected={this.props.isAllDirentSelected}
|
||||||
onAllItemSelected={this.props.onAllDirentSelected}
|
onAllItemSelected={this.props.onAllDirentSelected}
|
||||||
@@ -257,7 +242,6 @@ class LibContentContainer extends React.Component {
|
|||||||
onItemMove={this.props.onItemMove}
|
onItemMove={this.props.onItemMove}
|
||||||
onItemCopy={this.props.onItemCopy}
|
onItemCopy={this.props.onItemCopy}
|
||||||
onDirentClick={this.onDirentClick}
|
onDirentClick={this.onDirentClick}
|
||||||
onItemDetails={this.onItemDetails}
|
|
||||||
updateDirent={this.props.updateDirent}
|
updateDirent={this.props.updateDirent}
|
||||||
isAllItemSelected={this.props.isAllDirentSelected}
|
isAllItemSelected={this.props.isAllDirentSelected}
|
||||||
onAllItemSelected={this.props.onAllDirentSelected}
|
onAllItemSelected={this.props.onAllDirentSelected}
|
||||||
@@ -271,18 +255,26 @@ class LibContentContainer extends React.Component {
|
|||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{this.props.isDirentDetailShow && (
|
{this.props.isDirentDetailShow &&
|
||||||
|
<Fragment>
|
||||||
<div className="cur-view-detail">
|
<div className="cur-view-detail">
|
||||||
|
{this.props.path !== '/' ?
|
||||||
<DirentDetail
|
<DirentDetail
|
||||||
repoID={repoID}
|
repoID={repoID}
|
||||||
path={this.props.path}
|
path={this.props.path}
|
||||||
dirent={this.state.currentDirent}
|
dirent={this.state.currentDirent}
|
||||||
currentRepoInfo={this.props.currentRepoInfo}
|
currentRepoInfo={this.props.currentRepoInfo}
|
||||||
onItemDetailsClose={this.onItemDetailsClose}
|
|
||||||
onFileTagChanged={this.props.onFileTagChanged}
|
onFileTagChanged={this.props.onFileTagChanged}
|
||||||
|
onItemDetailsClose={this.props.closeDirentDetail}
|
||||||
|
/> :
|
||||||
|
<LibDetail
|
||||||
|
currentRepo={this.props.currentRepoInfo}
|
||||||
|
closeDetails={this.props.closeDirentDetail}
|
||||||
/>
|
/>
|
||||||
|
}
|
||||||
</div>
|
</div>
|
||||||
)}
|
</Fragment>
|
||||||
|
}
|
||||||
</Fragment>
|
</Fragment>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@@ -45,8 +45,6 @@ const propTypes = {
|
|||||||
onSearchedClick: PropTypes.func.isRequired,
|
onSearchedClick: PropTypes.func.isRequired,
|
||||||
isRepoOwner: PropTypes.bool.isRequired,
|
isRepoOwner: PropTypes.bool.isRequired,
|
||||||
// selected menu
|
// selected menu
|
||||||
onDirentSelected: PropTypes.func.isRequired,
|
|
||||||
showDirentDetail: PropTypes.func.isRequired,
|
|
||||||
onFilesTagChanged: PropTypes.func.isRequired, // for mutiple select toolbar
|
onFilesTagChanged: PropTypes.func.isRequired, // for mutiple select toolbar
|
||||||
updateDirent: PropTypes.func.isRequired,
|
updateDirent: PropTypes.func.isRequired,
|
||||||
};
|
};
|
||||||
@@ -99,8 +97,6 @@ class LibContentToolbar extends React.Component {
|
|||||||
currentRepoInfo={this.props.currentRepoInfo}
|
currentRepoInfo={this.props.currentRepoInfo}
|
||||||
enableDirPrivateShare={this.props.enableDirPrivateShare}
|
enableDirPrivateShare={this.props.enableDirPrivateShare}
|
||||||
updateDirent={this.props.updateDirent}
|
updateDirent={this.props.updateDirent}
|
||||||
onDirentSelected={this.props.onDirentSelected}
|
|
||||||
showDirentDetail={this.props.showDirentDetail}
|
|
||||||
relatedFiles={this.props.relatedFiles}
|
relatedFiles={this.props.relatedFiles}
|
||||||
unSelectDirent={this.props.unSelectDirent}
|
unSelectDirent={this.props.unSelectDirent}
|
||||||
onFilesTagChanged={this.props.onFilesTagChanged}
|
onFilesTagChanged={this.props.onFilesTagChanged}
|
||||||
|
@@ -78,9 +78,7 @@ class LibContentView extends React.Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
showDirentDetail = () => {
|
showDirentDetail = () => {
|
||||||
this.setState({
|
this.setState({isDirentDetailShow: true});
|
||||||
isDirentDetailShow: true,
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
toggleDirentDetail = () => {
|
toggleDirentDetail = () => {
|
||||||
@@ -747,6 +745,19 @@ class LibContentView extends React.Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
onDirentClick = (dirent) => {
|
onDirentClick = (dirent) => {
|
||||||
|
let direntList = this.state.direntList.map(dirent => {
|
||||||
|
dirent.isSelected = false;
|
||||||
|
return dirent;
|
||||||
|
});
|
||||||
|
dirent.isSelected = true;
|
||||||
|
this.setState({
|
||||||
|
direntList: direntList,
|
||||||
|
isDirentSelected: true,
|
||||||
|
selectedDirentList: [dirent],
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
onItemClick = (dirent) => {
|
||||||
this.resetSelected();
|
this.resetSelected();
|
||||||
let repoID = this.props.repoID;
|
let repoID = this.props.repoID;
|
||||||
let direntPath = Utils.joinPath(this.state.path, dirent.name);
|
let direntPath = Utils.joinPath(this.state.path, dirent.name);
|
||||||
@@ -1395,7 +1406,8 @@ class LibContentView extends React.Component {
|
|||||||
sortOrder={this.state.sortOrder}
|
sortOrder={this.state.sortOrder}
|
||||||
sortItems={this.sortItems}
|
sortItems={this.sortItems}
|
||||||
updateDirent={this.updateDirent}
|
updateDirent={this.updateDirent}
|
||||||
onItemClick={this.onDirentClick}
|
onDirentClick={this.onDirentClick}
|
||||||
|
onItemClick={this.onItemClick}
|
||||||
onItemSelected={this.onDirentSelected}
|
onItemSelected={this.onDirentSelected}
|
||||||
onItemDelete={this.onMainPanelItemDelete}
|
onItemDelete={this.onMainPanelItemDelete}
|
||||||
onItemRename={this.onMainPanelItemRename}
|
onItemRename={this.onMainPanelItemRename}
|
||||||
|
@@ -19,6 +19,8 @@ const TextTranslation = {
|
|||||||
'COMMENT' : {key : 'Comment', value : gettext('Comment')},
|
'COMMENT' : {key : 'Comment', value : gettext('Comment')},
|
||||||
'HISTORY' : {key : 'History', value : gettext('History')},
|
'HISTORY' : {key : 'History', value : gettext('History')},
|
||||||
'ACCESS_LOG' : {key : 'Access Log', value : gettext('Access Log')},
|
'ACCESS_LOG' : {key : 'Access Log', value : gettext('Access Log')},
|
||||||
|
'TAGS': {key: 'Tags', value: gettext('Tags')},
|
||||||
|
'RELATED_FILES': {key: 'Related Files', value: gettext('Related Files')},
|
||||||
};
|
};
|
||||||
|
|
||||||
export default TextTranslation;
|
export default TextTranslation;
|
@@ -907,6 +907,10 @@ table td {
|
|||||||
background-color: #f8f8f8;
|
background-color: #f8f8f8;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.tr-active {
|
||||||
|
background-color: #eee !important;
|
||||||
|
}
|
||||||
|
|
||||||
/* table-item reanme-component */
|
/* table-item reanme-component */
|
||||||
.rename-container input {
|
.rename-container input {
|
||||||
box-sizing: content-box;
|
box-sizing: content-box;
|
||||||
|
Reference in New Issue
Block a user