From f4be8814c58e09c1ed31fa076b1b74e22baac81e Mon Sep 17 00:00:00 2001 From: llj Date: Fri, 21 Feb 2025 21:17:49 +0800 Subject: [PATCH] [repo trash] redesigned it for mobile (#7502) --- .../components/dialog/trash-dialog/index.css | 39 ++++- .../components/dialog/trash-dialog/index.js | 35 ++-- .../table/file-records/file-record.js | 154 ++++++++++++++---- .../trash-dialog/table/file-records/index.js | 3 +- .../table/folder-records/folder-record.js | 87 +++++++--- .../table/folder-records/index.js | 3 +- .../dialog/trash-dialog/table/index.js | 35 +++- frontend/src/repo-folder-trash.js | 1 - 8 files changed, 274 insertions(+), 83 deletions(-) diff --git a/frontend/src/components/dialog/trash-dialog/index.css b/frontend/src/components/dialog/trash-dialog/index.css index e10af00029..5b75028530 100644 --- a/frontend/src/components/dialog/trash-dialog/index.css +++ b/frontend/src/components/dialog/trash-dialog/index.css @@ -1,18 +1,38 @@ .trash-dialog { - max-width: 1100px; - height: calc(100% - 56px); - overflow: hidden; + width: 100%; + height: 100%; + margin: 0; } .trash-dialog .modal-content { height: 100%; overflow: hidden; + border: none; + border-radius: 0; +} + +@media (min-width: 768px) { + .trash-dialog { + max-width: 1100px; + height: calc(100% - 56px); + overflow: hidden; + margin: 1.75rem auto; + } + + .trash-dialog .modal-content { + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 3px; + } } .trash-dialog .modal-header { align-items: center; } +.trash-dialog .back-icon { + color: #999; +} + .trash-dialog .modal-header .button-control { display: flex; justify-content: center; @@ -45,6 +65,19 @@ background: #dfdfdf; } +.trash-dialog .path-container { + border-bottom: 1px solid #eee; + height: 40px; + padding: 0 .5rem 1rem; +} + +@media (min-width: 768px) { + .trash-dialog .path-container { + border-bottom: none; + padding: 0 0 1rem; + } +} + @media (max-width: 768px) { .trash-dialog .modal-header .trash-dialog-old-page { font-size: 14px; diff --git a/frontend/src/components/dialog/trash-dialog/index.js b/frontend/src/components/dialog/trash-dialog/index.js index ec91350e4a..654ffc07d7 100644 --- a/frontend/src/components/dialog/trash-dialog/index.js +++ b/frontend/src/components/dialog/trash-dialog/index.js @@ -188,25 +188,38 @@ class TrashDialog extends React.Component { let title = gettext('{placeholder} Trash'); title = title.replace('{placeholder}', '' + Utils.HTMLescape(repoFolderName) + ''); + const isDesktop = Utils.isDesktop(); return ( <> - {gettext('Visit old version page')} + {isDesktop && {gettext('Visit old version page')}} {(enableUserCleanTrash && !showFolder && isRepoAdmin) && } - + {isDesktop && ( + + )} } > -
+ {!isDesktop && + + + } +
{isLoading && } @@ -214,15 +227,15 @@ class TrashDialog extends React.Component { } {!isLoading && items.length > 0 && -
-
+ <> +
{gettext('Current path: ')} {showFolder ? this.renderFolderPath() : {repoFolderName} }
- +
- + } diff --git a/frontend/src/components/dialog/trash-dialog/table/file-records/file-record.js b/frontend/src/components/dialog/trash-dialog/table/file-records/file-record.js index d12465b041..8f99fb69b6 100644 --- a/frontend/src/components/dialog/trash-dialog/table/file-records/file-record.js +++ b/frontend/src/components/dialog/trash-dialog/table/file-records/file-record.js @@ -1,6 +1,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import dayjs from 'dayjs'; +import { Dropdown, DropdownToggle, DropdownItem } from 'reactstrap'; import { Utils, isMobile } from '../../../../../utils/utils'; import { gettext, siteRoot } from '../../../../../utils/constants'; import { seafileAPI } from '../../../../../utils/seafile-api'; @@ -12,10 +13,17 @@ class FileRecord extends React.Component { super(props); this.state = { restored: false, - isIconShown: false + isIconShown: false, + isOpMenuOpen: false // for mobile }; } + toggleOpMenu = () => { + this.setState({ + isOpMenuOpen: !this.state.isOpMenuOpen + }); + }; + handleMouseOver = () => { this.setState({ isIconShown: true }); }; @@ -24,8 +32,12 @@ class FileRecord extends React.Component { this.setState({ isIconShown: false }); }; - restoreItem = (e) => { + onRestoreClicked = (e) => { e.preventDefault(); + this.restoreItem(); + }; + + restoreItem = () => { const { record } = this.props; const { commit_id, parent_dir, obj_name, is_dir } = record; const path = parent_dir + obj_name; @@ -55,40 +67,118 @@ class FileRecord extends React.Component { }; render() { - const { record } = this.props; + const { record, isDesktop } = this.props; const { restored, isIconShown } = this.state; if (restored) return null; - return record.is_dir ? ( - - - - - - - - - ) : ( - - - - - - - - - ); + if (isDesktop) { + return record.is_dir ? ( + + + + + + + + + ) : ( + + + + + + + + + ); + } else { // for mobile + return record.is_dir ? ( + + + + + + ) : ( + + + + + + ); + } } } diff --git a/frontend/src/components/dialog/trash-dialog/table/file-records/index.js b/frontend/src/components/dialog/trash-dialog/table/file-records/index.js index 4a7d4c3d5d..a871b23950 100644 --- a/frontend/src/components/dialog/trash-dialog/table/file-records/index.js +++ b/frontend/src/components/dialog/trash-dialog/table/file-records/index.js @@ -2,7 +2,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import FileRecord from './file-record'; -const FileRecords = ({ records, repoID, renderFolder }) => { +const FileRecords = ({ records, repoID, renderFolder, isDesktop }) => { if (!Array.isArray(records) || records.length === 0) return null; return records.map((record, index) => { return ( @@ -11,6 +11,7 @@ const FileRecords = ({ records, repoID, renderFolder }) => { record={record} repoID={repoID} renderFolder={renderFolder} + isDesktop={isDesktop} /> ); }); diff --git a/frontend/src/components/dialog/trash-dialog/table/folder-records/folder-record.js b/frontend/src/components/dialog/trash-dialog/table/folder-records/folder-record.js index 193b50ebff..bf6d12ac0e 100644 --- a/frontend/src/components/dialog/trash-dialog/table/folder-records/folder-record.js +++ b/frontend/src/components/dialog/trash-dialog/table/folder-records/folder-record.js @@ -27,33 +27,68 @@ class FolderRecord extends React.Component { }; render() { - const { commitID, baseDir, folderPath, record } = this.props; + const { commitID, baseDir, folderPath, record, isDesktop } = this.props; - return record.type == 'dir' ? ( - - - - - - - - - ) : ( - - - - - - - - - ); + if (isDesktop) { + return record.type == 'dir' ? ( + + + + + + + + + ) : ( + + + + + + + + + ); + } else { // for mobile + return record.type == 'dir' ? ( + + + + + + ) : ( + + + + + + ); + } } } diff --git a/frontend/src/components/dialog/trash-dialog/table/folder-records/index.js b/frontend/src/components/dialog/trash-dialog/table/folder-records/index.js index c5e25f5ca7..54d0969b1e 100644 --- a/frontend/src/components/dialog/trash-dialog/table/folder-records/index.js +++ b/frontend/src/components/dialog/trash-dialog/table/folder-records/index.js @@ -2,7 +2,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import FolderRecord from './folder-record'; -const FolderRecords = ({ records, repoID, commitID, baseDir, folderPath, renderFolder }) => { +const FolderRecords = ({ records, repoID, commitID, baseDir, folderPath, renderFolder, isDesktop }) => { if (!Array.isArray(records) || records.length === 0) return null; return records.map((record, index) => { return ( @@ -14,6 +14,7 @@ const FolderRecords = ({ records, repoID, commitID, baseDir, folderPath, renderF baseDir={baseDir} folderPath={folderPath} renderFolder={renderFolder} + isDesktop={isDesktop} /> ); }); diff --git a/frontend/src/components/dialog/trash-dialog/table/index.js b/frontend/src/components/dialog/trash-dialog/table/index.js index 760db85ffd..0a961040cb 100644 --- a/frontend/src/components/dialog/trash-dialog/table/index.js +++ b/frontend/src/components/dialog/trash-dialog/table/index.js @@ -4,8 +4,9 @@ import { gettext } from '../../../../utils/constants'; import FolderRecords from './folder-records'; import FileRecords from './file-records'; import FixedWidthTable from '../../../common/fixed-width-table'; +import LibsMobileThead from '../../../../components/libs-mobile-thead'; -const Table = ({ repoID, renderFolder, data }) => { +const Table = ({ repoID, renderFolder, data, isDesktop }) => { const headers = useMemo(() => [ { isFixed: true, width: 40, className: 'pl-2 pr-2' }, { isFixed: false, width: 0.25, children: gettext('Name') }, @@ -17,15 +18,33 @@ const Table = ({ repoID, renderFolder, data }) => { const { items, showFolder, commitID, baseDir, folderPath, folderItems } = data; + const tbodyContent = ( + <> + {showFolder ? ( + + ) : ( + + )} + + ); + return (
- - {showFolder ? ( - - ) : ( - - )} - + {isDesktop + ? ( + + {tbodyContent} + + ) + : ( +
{gettext('Folder')}{record.obj_name}{record.parent_dir}{dayjs(record.deleted_time).format('YYYY-MM-DD')} - {gettext('Restore')} -
{gettext('File')} - - {record.obj_name} - - {record.parent_dir} - {dayjs(record.deleted_time).format('YYYY-MM-DD')} - {Utils.bytesToSize(record.size)} - {gettext('Restore')} -
{gettext('Folder')}{record.obj_name}{record.parent_dir}{dayjs(record.deleted_time).format('YYYY-MM-DD')} + {gettext('Restore')} +
{gettext('File')} + + {record.obj_name} + + {record.parent_dir} + {dayjs(record.deleted_time).format('YYYY-MM-DD')} + {Utils.bytesToSize(record.size)} + {gettext('Restore')} +
+ {gettext('Folder')} + + {record.obj_name} +
+ {record.parent_dir} +
+ {dayjs(record.deleted_time).format('YYYY-MM-DD')} +
+ + +
+
+
+ + {gettext('Restore')} + +
+
+
+
{gettext('File')} + + {record.obj_name} + +
+ {record.parent_dir} +
+ {Utils.bytesToSize(record.size)} + + {dayjs(record.deleted_time).format('YYYY-MM-DD')} + +
+ + +
+
+
+ + {gettext('Restore')} + +
+
+
+
{gettext('Folder')}{record.name}{record.parent_dir}
- {gettext('File')} - - - {record.name} - - {record.parent_dir}{Utils.bytesToSize(record.size)}
{gettext('Folder')}{record.name}{record.parent_dir}
+ {gettext('File')} + + + {record.name} + + {record.parent_dir}{Utils.bytesToSize(record.size)}
+ {gettext('Folder')} + + {record.name} +
+ {record.parent_dir} +
+ {gettext('File')} + + + {record.name} + +
+ {record.parent_dir} +
+ {Utils.bytesToSize(record.size)} +
+ + + {tbodyContent} + +
+ ) + }
); }; diff --git a/frontend/src/repo-folder-trash.js b/frontend/src/repo-folder-trash.js index 3bbf90903e..245b9ec7e2 100644 --- a/frontend/src/repo-folder-trash.js +++ b/frontend/src/repo-folder-trash.js @@ -444,4 +444,3 @@ FolderItem.propTypes = { const root = createRoot(document.getElementById('wrapper')); root.render(); -