1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-09-12 21:30:39 +00:00

optimize file name in grid view (#6345)

* optimize file name in grid view

* optimize codes
This commit is contained in:
Michael An
2024-07-15 15:13:34 +08:00
committed by GitHub
parent f12358edd1
commit 3f9e071a17
2 changed files with 60 additions and 6 deletions

View File

@@ -181,6 +181,50 @@ class DirentGridItem extends React.Component {
this.props.onGridItemContextMenu(event, dirent); this.props.onGridItemContextMenu(event, dirent);
}; };
getTextRenderWidth = (text, font) => {
const canvas = document.createElement('canvas');
const context = canvas.getContext('2d');
context.font = font || '14px Arial';
const metrics = context.measureText(text);
return metrics.width;
};
getRenderedText = (dirent) => {
const containerWidth = 230;
let tagRenderWidth = 0;
if (dirent.file_tags && dirent.file_tags.length > 0) {
if (dirent.file_tags.length === 1) {
tagRenderWidth = 16;
} else {
tagRenderWidth = 16 + (dirent.file_tags.length - 1) * 8;
}
}
let remainWidth = containerWidth - tagRenderWidth;
let nameRenderWidth = this.getTextRenderWidth(dirent.name);
let showName = '';
if (nameRenderWidth > remainWidth) {
let dotIndex = dirent.name.lastIndexOf('.');
let frontName = dirent.name.slice(0, dotIndex - 2);
let backName = dirent.name.slice(dotIndex - 2);
let sum = 0;
for (let i = 0; i < frontName.length; i++) {
// Use charCodeAt(i) > 127 to check Chinese and English.
// English and symbols occupy 1 position, Chinese and others occupy 2 positions.
frontName.charCodeAt(i) > 127 ? (sum = sum + 2 ) : (sum = sum + 1);
// When sum position exceeds 20, back string will not be displayed.
if (sum > 20) {
frontName = frontName.slice(0, i) + '...';
break;
}
}
showName = frontName + backName;
} else {
showName = dirent.name;
}
return showName;
};
render() { render() {
let { dirent, path } = this.props; let { dirent, path } = this.props;
let direntPath = Utils.joinPath(path, dirent.name); let direntPath = Utils.joinPath(path, dirent.name);
@@ -212,6 +256,7 @@ class DirentGridItem extends React.Component {
const lockedImageUrl = `${mediaUrl}img/file-${dirent.is_freezed ? 'freezed' : 'locked'}-32.png`; const lockedImageUrl = `${mediaUrl}img/file-${dirent.is_freezed ? 'freezed' : 'locked'}-32.png`;
const lockedMessage = dirent.is_freezed ? gettext('freezed') : gettext('locked'); const lockedMessage = dirent.is_freezed ? gettext('freezed') : gettext('locked');
const showName = this.getRenderedText(dirent);
return ( return (
<Fragment> <Fragment>
<li className="grid-item" onContextMenu={this.onGridItemContextMenu} onMouseDown={this.onGridItemMouseDown}> <li className="grid-item" onContextMenu={this.onGridItemContextMenu} onMouseDown={this.onGridItemMouseDown}>
@@ -248,8 +293,17 @@ class DirentGridItem extends React.Component {
</Fragment> </Fragment>
)} )}
{(!dirent.isDir() && !this.canPreview) ? {(!dirent.isDir() && !this.canPreview) ?
<a className={`sf-link grid-file-name-link ${this.state.isGridSelected ? 'grid-link-selected-active' : ''}`} onClick={this.onItemLinkClick}>{dirent.name}</a> : <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> className={`sf-link grid-file-name-link ${this.state.isGridSelected ? 'grid-link-selected-active' : ''}`}
onClick={this.onItemLinkClick}
title={dirent.name}
>{showName}</a> :
<a
className={`grid-file-name-link ${this.state.isGridSelected ? 'grid-link-selected-active' : ''}`}
href={dirent.type === 'dir' ? dirHref : fileHref}
onClick={this.onItemLinkClick}
title={dirent.name}
>{showName}</a>
} }
</div> </div>
</li> </li>
@@ -259,4 +313,5 @@ class DirentGridItem extends React.Component {
} }
DirentGridItem.propTypes = propTypes; DirentGridItem.propTypes = propTypes;
export default DirentGridItem; export default DirentGridItem;

View File

@@ -54,18 +54,17 @@
display: inline-block; display: inline-block;
max-width: 100%; max-width: 100%;
overflow: hidden; overflow: hidden;
word-break: keep-all;
line-height: 17px; line-height: 17px;
font-size: 14px; font-size: 14px;
height: 34px;
} }
.grid-file-name-link { .grid-file-name-link {
color: #212529; color: #212529;
font-size: 0.875rem; font-size: 0.875rem;
display: -webkit-box;
-webkit-box-orient: vertical; -webkit-box-orient: vertical;
-webkit-line-clamp: 2; word-wrap: break-word;
white-space: pre-wrap; word-break: break-all;
} }
.grid-file-locked-icon { .grid-file-locked-icon {