1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-04-27 02:51:00 +00:00

remove svg-sprite-loader

This commit is contained in:
Michael An 2025-04-25 10:08:50 +08:00
parent 065ecb0b1f
commit 726e34d47c
7 changed files with 418 additions and 1741 deletions

View File

@ -438,12 +438,17 @@ module.exports = function (webpackEnv) {
ref: true,
},
},
{
loader: require.resolve('file-loader'),
{ loader: 'svgo-loader',
options: {
name: 'static/media/[name].[hash].[ext]',
},
},
plugins: [
'removeTitle',
'removeStyleElement',
'cleanupIDs',
'inlineStyles',
'removeXMLProcInst',
]
}
}
],
issuer: {
and: [/\.(ts|tsx|js|jsx|md|mdx)$/],
@ -596,7 +601,16 @@ module.exports = function (webpackEnv) {
test: /\.svg$/,
use: [
{
loader: 'svg-sprite-loader', options: {}
loader: require.resolve('@svgr/webpack'),
options: {
prettier: false,
svgo: false,
svgoConfig: {
plugins: [{ removeViewBox: false }],
},
titleProp: true,
ref: true,
},
},
{ loader: 'svgo-loader', options: {
plugins: [

File diff suppressed because it is too large Load Diff

View File

@ -51,7 +51,6 @@
"react-transition-group": "4.4.5",
"reactstrap": "9.2.3",
"socket.io-client": "^4.8.1",
"svg-sprite-loader": "^6.0.11",
"svgo-loader": "^3.0.1",
"unified": "^7.0.0",
"url-parse": "^1.4.3",

View File

@ -1,27 +1,313 @@
import React from 'react';
import PropTypes from 'prop-types';
import classnames from 'classnames';
import AISearchIcon from '../assets/icons/AI-search.svg';
import AddTableIcon from '../assets/icons/add-table.svg';
import AiIcon from '../assets/icons/ai.svg';
import ArrowIcon from '../assets/icons/arrow.svg';
import BellIcon from '../assets/icons/bell.svg';
import CheckCircleIcon from '../assets/icons/check-circle.svg';
import CheckMarkIcon from '../assets/icons/check-mark.svg';
import CheckSquareSolidIcon from '../assets/icons/check-square-solid.svg';
import CheckboxIcon from '../assets/icons/checkbox.svg';
import ClientIcon from '../assets/icons/client.svg';
import CloseIcon from '../assets/icons/close.svg';
import CollaboratorIcon from '../assets/icons/collaborator.svg';
import CopyIcon from '../assets/icons/copy.svg';
import CreationTimeIcon from '../assets/icons/creation-time.svg';
import CreatorIcon from '../assets/icons/creator.svg';
import CurrencyIcon from '../assets/icons/currency.svg';
import DateIcon from '../assets/icons/date.svg';
import DeleteIcon from '../assets/icons/delete.svg';
import DescriptionIcon from '../assets/icons/description.svg';
import DoubleArrowDownIcon from '../assets/icons/double-arrow-down.svg';
import DoubleArrowUpIcon from '../assets/icons/double-arrow-up.svg';
import DownloadIcon from '../assets/icons/download.svg';
import DragIcon from '../assets/icons/drag.svg';
import DropDownIcon from '../assets/icons/drop-down.svg';
import EditIcon from '../assets/icons/edit.svg';
import ExclamationCircleIcon from '../assets/icons/exclamation-circle.svg';
import ExclamationTriangleIcon from '../assets/icons/exclamation-triangle.svg';
import ExpandIcon from '../assets/icons/expand.svg';
import EyeSlashIcon from '../assets/icons/eye-slash.svg';
import FaceRecognitionViewIcon from '../assets/icons/face-recognition-view.svg';
import FileIcon from '../assets/icons/file.svg';
import FilesIcon from '../assets/icons/files.svg';
import FilterCircledIcon from '../assets/icons/filter-circled.svg';
import FilterIcon from '../assets/icons/filter.svg';
import FlagIcon from '../assets/icons/flag.svg';
import FolderIcon from '../assets/icons/folder.svg';
import FoldersIcon from '../assets/icons/folders.svg';
import ForkNumberIcon from '../assets/icons/fork-number.svg';
import GroupIcon from '../assets/icons/group.svg';
import HelpfulSelectedIcon from '../assets/icons/helpful-selected.svg';
import HelpfulIcon from '../assets/icons/helpful.svg';
import HelplessSelectedIcon from '../assets/icons/helpless-selected.svg';
import HelplessIcon from '../assets/icons/helpless.svg';
import HideIcon from '../assets/icons/hide.svg';
import ImageIcon from '../assets/icons/image.svg';
import InfoIcon from '../assets/icons/info.svg';
import KanbanIcon from '../assets/icons/kanban.svg';
import LeftArrowIcon from '../assets/icons/left_arrow.svg';
import LikeIcon from '../assets/icons/like.svg';
import LinkIcon from '../assets/icons/link.svg';
import LinkageIcon from '../assets/icons/linkage.svg';
import LocationIcon from '../assets/icons/location.svg';
import LockIcon from '../assets/icons/lock.svg';
import LongTextIcon from '../assets/icons/long-text.svg';
import MainViewIcon from '../assets/icons/main-view.svg';
import MapIcon from '../assets/icons/map.svg';
import MarkdownIcon from '../assets/icons/markdown.svg';
import MinusSignIcon from '../assets/icons/minus_sign.svg';
import MonitorIcon from '../assets/icons/monitor.svg';
import MoreLevelIcon from '../assets/icons/more-level.svg';
import MoreVerticalIcon from '../assets/icons/more-vertical.svg';
import MoveToIcon from '../assets/icons/move-to.svg';
import MultipleSelectIcon from '../assets/icons/multiple-select.svg';
import NumberIcon from '../assets/icons/number.svg';
import OpenFileIcon from '../assets/icons/open-file.svg';
import OpenFolderIcon from '../assets/icons/open-folder.svg';
import PartiallySelectedIcon from '../assets/icons/partially-selected.svg';
import PlusSignIcon from '../assets/icons/plus_sign.svg';
import PraiseIcon from '../assets/icons/praise.svg';
import PrintIcon from '../assets/icons/print.svg';
import RateIcon from '../assets/icons/rate.svg';
import RemoveFromFolderIcon from '../assets/icons/remove-from-folder.svg';
import RenameIcon from '../assets/icons/rename.svg';
import RightArrowIcon from '../assets/icons/right_arrow.svg';
import RotateIcon from '../assets/icons/rotate.svg';
import RowHeightDefaultIcon from '../assets/icons/row-height-default.svg';
import RowHeightDoubleIcon from '../assets/icons/row-height-double.svg';
import RowHeightQuadrupleIcon from '../assets/icons/row-height-quadruple.svg';
import RowHeightTripleIcon from '../assets/icons/row-height-triple.svg';
import SaveIcon from '../assets/icons/save.svg';
import SearchIcon from '../assets/icons/search.svg';
import SendIcon from '../assets/icons/send.svg';
import SetUpIcon from '../assets/icons/set-up.svg';
import ShareIcon from '../assets/icons/share.svg';
import SingleSelectIcon from '../assets/icons/single-select.svg';
import SortAscendingIcon from '../assets/icons/sort-ascending.svg';
import SortDescendingIcon from '../assets/icons/sort-descending.svg';
import SortIcon from '../assets/icons/sort.svg';
import SpinnerIcon from '../assets/icons/spinner.svg';
import TableIcon from '../assets/icons/table.svg';
import TagIcon from '../assets/icons/tag.svg';
import TextIcon from '../assets/icons/text.svg';
import TimeIcon from '../assets/icons/time.svg';
import UnlockIcon from '../assets/icons/unlock.svg';
import UrlIcon from '../assets/icons/url.svg';
import WikiPreviewIcon from '../assets/icons/wiki-preview.svg';
import WikiSettingsIcon from '../assets/icons/wiki-settings.svg';
import X01Icon from '../assets/icons/x-01.svg';
import '../css/icon.css';
const importAll = (requireContext) => {
requireContext.keys().forEach(requireContext);
};
try {
importAll(require.context('../assets/icons', true, /\.svg$/));
} catch (error) {
// eslint-disable-next-line no-console
console.log(error);
}
const Icon = (props) => {
const { className, symbol, style } = props;
const iconClass = classnames('seafile-multicolor-icon', className, `seafile-multicolor-icon-${symbol}`);
return (
<svg className={iconClass} style={style}>
<use xlinkHref={`#${symbol}`} />
</svg>
);
const commonProps = { className: iconClass, style: style, ariaHidden: 'true' };
switch (symbol) {
case 'ai-search':
return <AISearchIcon {...commonProps} />;
case 'add-table':
return <AddTableIcon {...commonProps} />;
case 'ai':
return <AiIcon {...commonProps} />;
case 'arrow':
return <ArrowIcon {...commonProps} />;
case 'bell':
return <BellIcon {...commonProps} />;
case 'check-circle':
return <CheckCircleIcon {...commonProps} />;
case 'check-mark':
return <CheckMarkIcon {...commonProps} />;
case 'check-square-solid':
return <CheckSquareSolidIcon {...commonProps} />;
case 'checkbox':
return <CheckboxIcon {...commonProps} />;
case 'client':
return <ClientIcon {...commonProps} />;
case 'close':
return <CloseIcon {...commonProps} />;
case 'collaborator':
return <CollaboratorIcon {...commonProps} />;
case 'copy':
return <CopyIcon {...commonProps} />;
case 'creation-time':
return <CreationTimeIcon {...commonProps} />;
case 'creator':
return <CreatorIcon {...commonProps} />;
case 'currency':
return <CurrencyIcon {...commonProps} />;
case 'date':
return <DateIcon {...commonProps} />;
case 'delete':
return <DeleteIcon {...commonProps} />;
case 'description':
return <DescriptionIcon {...commonProps} />;
case 'double-arrow-down':
return <DoubleArrowDownIcon {...commonProps} />;
case 'double-arrow-up':
return <DoubleArrowUpIcon {...commonProps} />;
case 'download':
return <DownloadIcon {...commonProps} />;
case 'drag':
return <DragIcon {...commonProps} />;
case 'drop-down':
return <DropDownIcon {...commonProps} />;
case 'edit':
return <EditIcon {...commonProps} />;
case 'exclamation-circle':
return <ExclamationCircleIcon {...commonProps} />;
case 'exclamation-triangle':
return <ExclamationTriangleIcon {...commonProps} />;
case 'expand':
return <ExpandIcon {...commonProps} />;
case 'eye-slash':
return <EyeSlashIcon {...commonProps} />;
case 'face-recognition-view':
return <FaceRecognitionViewIcon {...commonProps} />;
case 'file':
return <FileIcon {...commonProps} />;
case 'files':
return <FilesIcon {...commonProps} />;
case 'filter-circled':
return <FilterCircledIcon {...commonProps} />;
case 'filter':
return <FilterIcon {...commonProps} />;
case 'flag':
return <FlagIcon {...commonProps} />;
case 'folder':
return <FolderIcon {...commonProps} />;
case 'folders':
return <FoldersIcon {...commonProps} />;
case 'fork-number':
return <ForkNumberIcon {...commonProps} />;
case 'group':
return <GroupIcon {...commonProps} />;
case 'helpful-selected':
return <HelpfulSelectedIcon {...commonProps} />;
case 'helpful':
return <HelpfulIcon {...commonProps} />;
case 'helpless-selected':
return <HelplessSelectedIcon {...commonProps} />;
case 'helpless':
return <HelplessIcon {...commonProps} />;
case 'hide':
return <HideIcon {...commonProps} />;
case 'image':
return <ImageIcon {...commonProps} />;
case 'info':
return <InfoIcon {...commonProps} />;
case 'kanban':
return <KanbanIcon {...commonProps} />;
case 'left-arrow':
return <LeftArrowIcon {...commonProps} />;
case 'like':
return <LikeIcon {...commonProps} />;
case 'link':
return <LinkIcon {...commonProps} />;
case 'linkage':
return <LinkageIcon {...commonProps} />;
case 'location':
return <LocationIcon {...commonProps} />;
case 'lock':
return <LockIcon {...commonProps} />;
case 'long-text':
return <LongTextIcon {...commonProps} />;
case 'main-view':
return <MainViewIcon {...commonProps} />;
case 'map':
return <MapIcon {...commonProps} />;
case 'markdown':
return <MarkdownIcon {...commonProps} />;
case 'minus_sign':
return <MinusSignIcon {...commonProps} />;
case 'monitor':
return <MonitorIcon {...commonProps} />;
case 'more-level':
return <MoreLevelIcon {...commonProps} />;
case 'more-vertical':
return <MoreVerticalIcon {...commonProps} />;
case 'move-to':
return <MoveToIcon {...commonProps} />;
case 'multiple-select':
return <MultipleSelectIcon {...commonProps} />;
case 'number':
return <NumberIcon {...commonProps} />;
case 'open-file':
return <OpenFileIcon {...commonProps} />;
case 'open-folder':
return <OpenFolderIcon {...commonProps} />;
case 'partially-selected':
return <PartiallySelectedIcon {...commonProps} />;
case 'plus_sign':
return <PlusSignIcon {...commonProps} />;
case 'praise':
return <PraiseIcon {...commonProps} />;
case 'print':
return <PrintIcon {...commonProps} />;
case 'rate':
return <RateIcon {...commonProps} />;
case 'remove-from-folder':
return <RemoveFromFolderIcon {...commonProps} />;
case 'rename':
return <RenameIcon {...commonProps} />;
case 'right_arrow':
return <RightArrowIcon {...commonProps} />;
case 'rotate':
return <RotateIcon {...commonProps} />;
case 'row-height-default':
return <RowHeightDefaultIcon {...commonProps} />;
case 'row-height-double':
return <RowHeightDoubleIcon {...commonProps} />;
case 'row-height-quadruple':
return <RowHeightQuadrupleIcon {...commonProps} />;
case 'row-height-triple':
return <RowHeightTripleIcon {...commonProps} />;
case 'save':
return <SaveIcon {...commonProps} />;
case 'search':
return <SearchIcon {...commonProps} />;
case 'send':
return <SendIcon {...commonProps} />;
case 'set-up':
return <SetUpIcon {...commonProps} />;
case 'share':
return <ShareIcon {...commonProps} />;
case 'single-select':
return <SingleSelectIcon {...commonProps} />;
case 'sort-ascending':
return <SortAscendingIcon {...commonProps} />;
case 'sort-descending':
return <SortDescendingIcon {...commonProps} />;
case 'sort':
return <SortIcon {...commonProps} />;
case 'spinner':
return <SpinnerIcon {...commonProps} />;
case 'table':
return <TableIcon {...commonProps} />;
case 'tag':
return <TagIcon {...commonProps} />;
case 'text':
return <TextIcon {...commonProps} />;
case 'time':
return <TimeIcon {...commonProps} />;
case 'unlock':
return <UnlockIcon {...commonProps} />;
case 'url':
return <UrlIcon {...commonProps} />;
case 'wiki-preview':
return <WikiPreviewIcon {...commonProps} />;
case 'wiki-settings':
return <WikiSettingsIcon {...commonProps} />;
case 'x-01':
return <X01Icon {...commonProps} />;
default:
return null;
}
};
Icon.propTypes = {

View File

@ -1,14 +1,16 @@
import React from 'react';
import PropTypes from 'prop-types';
import Icon from '../../../components/icon';
import classNames from 'classnames';
import FileIcon from '../../../assets/icons/file.svg';
import FilesIcon from '../../../assets/icons/files.svg';
import '../css/nav-item-icon.css';
function NavItemIcon({ symbol, className, disable, onClick }) {
return (
<div onClick={onClick} className={classNames('nav-item-icon', { 'nav-item-icon-disable': disable })} role="button">
<Icon symbol={symbol} className={className} aria-hidden="true" />
{symbol === 'file' && <FileIcon className='seafile-multicolor-icon' aria-hidden="true" />}
{symbol === 'files' && <FilesIcon className='seafile-multicolor-icon' aria-hidden="true" />}
</div>
);
}

View File

@ -20,6 +20,10 @@
width: 16px;
}
.nav-item-icon .seafile-multicolor-icon path {
fill: #666666;
}
.nav-item-icon:hover:not(.nav-item-icon-disable) {
background-color: #DFDFDD;
}

View File

@ -21,12 +21,10 @@ function WikiTopNav({ config, currentPageId, setCurrentPage, currentPageLocked }
{item.icon ? <CustomIcon icon={item.icon} /> : <NavItemIcon symbol={'file'} disable={true} />}
<div className="d-flex align-items-center">
<span className='text-truncate' title={item.name} aria-label={item.name}>{item.name}</span>
</div>
</div>
{index !== paths.length - 1 && <span className="item-split">/</span>}
</Fragment>
);
})}
{paths.length > 0 && currentPageLocked && <img className="locked" src={lockedImageUrl} alt={gettext('freezed')} title={gettext('Page is frozen')}/>}