From ed5439a4e36f4b2303e30e4bd3ebfc6296a60b8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E9=A1=BA=E5=BC=BA?= Date: Tue, 18 Dec 2018 17:21:01 +0800 Subject: [PATCH] Repo optimized (#2664) --- .../src/components/dialog/share-to-user.js | 2 +- frontend/src/components/dir-view/dir-panel.js | 21 ++++++------- frontend/src/components/dir-view/dir-view.js | 30 ++++++++++++------- .../dirent-detail/detail-list-view.js | 6 ++-- .../dirent-detail/dirent-details.js | 10 +++---- .../dirent-list-view/dirent-list-item.js | 4 +-- .../dirent-list-view/dirent-list-view.js | 4 +-- .../dirent-list-view/dirent-menu.js | 6 ++-- .../components/file-chooser/file-chooser.js | 18 ++++++----- .../components/file-chooser/repo-list-view.js | 8 ++--- .../src/models/{repoInfo.js => repo-info.js} | 13 ++++---- frontend/src/models/repo.js | 9 +++--- frontend/src/pages/groups/group-view.js | 10 +++---- frontend/src/pages/groups/groups-view.js | 4 +-- .../src/pages/repo-wiki-mode/main-panel.js | 16 +++++----- 15 files changed, 83 insertions(+), 78 deletions(-) rename frontend/src/models/{repoInfo.js => repo-info.js} (55%) diff --git a/frontend/src/components/dialog/share-to-user.js b/frontend/src/components/dialog/share-to-user.js index 01c5a1704b..cd44498fe8 100644 --- a/frontend/src/components/dialog/share-to-user.js +++ b/frontend/src/components/dialog/share-to-user.js @@ -25,7 +25,7 @@ class UserItem extends React.Component { deleteShareItem = () => { let item = this.props.item; - this.props.deleteShareItem(item.name); + this.props.deleteShareItem(item.user_info.name); } render() { diff --git a/frontend/src/components/dir-view/dir-panel.js b/frontend/src/components/dir-view/dir-panel.js index 0910d86cec..0b955a59a1 100644 --- a/frontend/src/components/dir-view/dir-panel.js +++ b/frontend/src/components/dir-view/dir-panel.js @@ -1,8 +1,7 @@ import React, { Fragment } from 'react'; import PropTypes from 'prop-types'; import cookie from 'react-cookies'; -import { gettext, siteRoot } from '../../utils/constants'; -import { seafileAPI } from '../../utils/seafile-api'; +import { gettext, siteRoot, username } from '../../utils/constants'; import CommonToolbar from '../toolbar/common-toolbar'; import ViewModeToolbar from '../toolbar/view-mode-toolbar'; import DirOperationToolBar from '../toolbar/dir-operation-toolbar'; @@ -15,7 +14,7 @@ import ModalPortal from '../modal-portal'; import LibDecryptDialog from '../dialog/lib-decrypt-dialog'; const propTypes = { - currentRepo: PropTypes.object, + currentRepoInfo: PropTypes.object, pathPrefix: PropTypes.array.isRequired, path: PropTypes.string.isRequired, repoID: PropTypes.string.isRequired, @@ -56,18 +55,15 @@ class DirPanel extends React.Component { currentDirent: null, currentMode: 'list', isDirentDetailShow: false, - isRepoOwner: true, + isRepoOwner: false, }; } componentDidMount() { - let currentRepo = this.props.currentRepo; - if (currentRepo) { - seafileAPI.getAccountInfo().then(res => { - let user_email = res.data.email; - let isRepoOwner = currentRepo.owner_email === user_email; - this.setState({isRepoOwner: isRepoOwner}); - }); + let currentRepoInfo = this.props.currentRepoInfo; + if (currentRepoInfo) { + let isRepoOwner = currentRepoInfo.owner_email === username; + this.setState({isRepoOwner: isRepoOwner}); } } @@ -79,6 +75,7 @@ class DirPanel extends React.Component { } onItemDetailsClose = () => { + // todo there is bug when change item this.setState({isDirentDetailShow: false}); } @@ -171,7 +168,7 @@ class DirPanel extends React.Component { path={this.props.path} repoID={this.props.repoID} direntList={this.props.direntList} - currentRepo={this.props.currentRepo} + currentRepoInfo={this.props.currentRepoInfo} isDirentListLoading={this.props.isDirentListLoading} isAllItemSelected={this.props.isAllDirentSelected} isRepoOwner={this.state.isRepoOwner} diff --git a/frontend/src/components/dir-view/dir-view.js b/frontend/src/components/dir-view/dir-view.js index dfedfb12d1..431a841033 100644 --- a/frontend/src/components/dir-view/dir-view.js +++ b/frontend/src/components/dir-view/dir-view.js @@ -8,7 +8,7 @@ import toaster from '../toast'; import DirPanel from './dir-panel'; import Dirent from '../../models/dirent'; import FileTag from '../../models/file-tag'; -import Repo from '../../models/repo'; +import RepoInfo from '../../models/repo-info'; const propTypes = { pathPrefix: PropTypes.array.isRequired, @@ -31,7 +31,7 @@ class DirView extends React.Component { isDirentSelected: false, isAllDirentSelected: false, isDirentListLoading: true, - currentRepo: null, + currentRepoInfo: null, direntList: [], selectedDirentList: [], }; @@ -50,16 +50,16 @@ class DirView extends React.Component { let location = decodeURIComponent(window.location.href); let repoID = this.props.repoID; seafileAPI.getRepoInfo(repoID).then(res => { - let repo = new Repo(res.data); + let repoInfo = new RepoInfo(res.data); this.setState({ - repoID: repo.repo_id, - repoName: repo.repo_name, - permission: repo.permission === 'rw', - currentRepo: repo, + currentRepoInfo: repoInfo, + repoID: repoInfo.repo_id, + repoName: repoInfo.repo_name, + permission: repoInfo.permission === 'rw', libNeedDecrypt: res.data.lib_need_decrypt, }); - let repoName = repo.repo_name; + let repoName = repoInfo.repo_name; let index = location.indexOf(repoName); let path = location.slice(index + repoName.length); this.setState({path: path}); @@ -234,7 +234,11 @@ class DirView extends React.Component { let repoID = this.state.repoID; seafileAPI.moveDir(repoID, destRepo.repo_id, destDirentPath, this.state.path, dirNames).then(() => { let direntList = this.deleteItems(dirNames); - this.setState({direntList: direntList}); + this.setState({ + direntList: direntList, + isDirentSelected: false, + selectedDirentList: [], + }); let message = gettext('Successfully moved %(name)s.'); message = message.replace('%(name)s', dirNames); toaster.success(message); @@ -264,7 +268,11 @@ class DirView extends React.Component { let repoID = this.state.repoID; seafileAPI.deleteMutipleDirents(repoID, this.state.path, dirNames).then(res => { let direntList = this.deleteItems(dirNames); - this.setState({direntList: direntList}); + this.setState({ + direntList: direntList, + isDirentSelected: false, + selectedDirentList: [], + }); }); } @@ -453,7 +461,7 @@ class DirView extends React.Component { return ( { - let { repo } = this.props; + let { repoInfo } = this.props; let direntPath = this.getDirentPath(); - let position = repo.repo_name; + let position = repoInfo.repo_name; if (direntPath !== '/') { let index = direntPath.lastIndexOf('/'); let path = direntPath.slice(0, index); diff --git a/frontend/src/components/dirent-detail/dirent-details.js b/frontend/src/components/dirent-detail/dirent-details.js index ccf6e8097d..f7936fb54d 100644 --- a/frontend/src/components/dirent-detail/dirent-details.js +++ b/frontend/src/components/dirent-detail/dirent-details.js @@ -4,7 +4,7 @@ import { Utils } from '../../utils/utils'; import { siteRoot } from '../../utils/constants'; import { seafileAPI } from '../../utils/seafile-api'; import DetailListView from './detail-list-view'; -import Repo from '../../models/repo'; +import RepoInfo from '../../models/repo-info'; import FileTag from '../../models/file-tag'; import '../../css/dirent-detail.css'; @@ -23,7 +23,7 @@ class DirentDetail extends React.Component { this.state = { direntType: '', direntDetail: '', - repo: null, + repoInfo: null, fileTagList: [], }; } @@ -32,8 +32,8 @@ class DirentDetail extends React.Component { let { dirent, path, repoID } = this.props; let direntPath = Utils.joinPath(path, dirent.name); seafileAPI.getRepoInfo(repoID).then(res => { - let repo = new Repo(res.data); - this.setState({repo: repo}); + let repoInfo = new RepoInfo(res.data); + this.setState({repoInfo: repoInfo}); this.updateDetailView(dirent, direntPath); }); } @@ -89,7 +89,7 @@ class DirentDetail extends React.Component { {this.state.direntDetail &&
} diff --git a/frontend/src/components/dirent-list-view/dirent-list-view.js b/frontend/src/components/dirent-list-view/dirent-list-view.js index 94defa29c8..3bb387061c 100644 --- a/frontend/src/components/dirent-list-view/dirent-list-view.js +++ b/frontend/src/components/dirent-list-view/dirent-list-view.js @@ -8,7 +8,7 @@ const propTypes = { path: PropTypes.string.isRequired, repoID: PropTypes.string.isRequired, isRepoOwner: PropTypes.bool, - currentRepo: PropTypes.object, + currentRepoInfo: PropTypes.object, isAllItemSelected: PropTypes.bool.isRequired, isDirentListLoading: PropTypes.bool.isRequired, direntList: PropTypes.array.isRequired, @@ -80,7 +80,7 @@ class DirentListView extends React.Component { dirent={dirent} path={this.props.path} repoID={this.props.repoID} - currentRepo={this.props.currentRepo} + currentRepoInfo={this.props.currentRepoInfo} isRepoOwner={this.props.isRepoOwner} onItemClick={this.props.onItemClick} onItemRenameToggle={this.onItemRenameToggle} diff --git a/frontend/src/components/dirent-list-view/dirent-menu.js b/frontend/src/components/dirent-list-view/dirent-menu.js index 918bab2097..ebf0362dcc 100644 --- a/frontend/src/components/dirent-list-view/dirent-menu.js +++ b/frontend/src/components/dirent-list-view/dirent-menu.js @@ -7,7 +7,7 @@ const propTypes = { dirent: PropTypes.object.isRequired, menuPosition: PropTypes.object.isRequired, onMenuItemClick: PropTypes.func.isRequired, - currentRepo: PropTypes.object.isRequired, + currentRepoInfo: PropTypes.object.isRequired, isRepoOwner: PropTypes.bool.isRequired, }; @@ -21,8 +21,8 @@ class DirentMenu extends React.Component { } componentDidMount() { - let repo = this.props.currentRepo; - let menuList = this.calculateMenuList(repo); + let repoInfo = this.props.currentRepoInfo; + let menuList = this.calculateMenuList(repoInfo); this.setState({ menuList: menuList, menuHeight: menuList.length * 30, diff --git a/frontend/src/components/file-chooser/file-chooser.js b/frontend/src/components/file-chooser/file-chooser.js index 5a312ac7e8..b18cb1a581 100644 --- a/frontend/src/components/file-chooser/file-chooser.js +++ b/frontend/src/components/file-chooser/file-chooser.js @@ -3,7 +3,7 @@ import PropTypes from 'prop-types'; import RepoListView from './repo-list-view'; import { seafileAPI } from '../../utils/seafile-api'; import { gettext } from '../../utils/constants'; -import Repo from '../../models/repo'; +import RepoInfo from '../../models/repo-info'; import '../../css/file-chooser.css'; @@ -22,7 +22,7 @@ class FileChooser extends React.Component { isCurrentRepoShow: true, isOtherRepoShow: false, repoList: [], - currentRepo: null, + currentRepoInfo: null, selectedRepo: null, selectedPath: '', }; @@ -31,22 +31,24 @@ class FileChooser extends React.Component { componentDidMount() { let repoID = this.props.repoID; seafileAPI.getRepoInfo(repoID).then(res => { - let repo = new Repo(res.data); + // need to optimized + let repoInfo = new RepoInfo(res.data); this.setState({ - currentRepo: repo, + currentRepoInfo: repoInfo, }); }); } onOtherRepoToggle = () => { if (!this.state.hasRequest) { - let { currentRepo } = this.state; + let { currentRepoInfo } = this.state; seafileAPI.listRepos().then(res => { + // todo optimized code let repos = res.data.repos; let repoList = []; let repoIdList = []; for(let i = 0; i < repos.length; i++) { - if (repos[i].repo_name === currentRepo.repo_name || repos[i].permission !== 'rw') { + if (repos[i].repo_name === currentRepoInfo.repo_name || repos[i].permission !== 'rw') { continue; } if (repoIdList.indexOf(repos[i].repo_id) > -1) { @@ -94,10 +96,10 @@ class FileChooser extends React.Component { {gettext('Current Library')}
{ - this.state.isCurrentRepoShow && this.state.currentRepo && + this.state.isCurrentRepoShow && this.state.currentRepoInfo && diff --git a/frontend/src/models/repoInfo.js b/frontend/src/models/repo-info.js similarity index 55% rename from frontend/src/models/repoInfo.js rename to frontend/src/models/repo-info.js index ca49afda7e..8dd0255315 100644 --- a/frontend/src/models/repoInfo.js +++ b/frontend/src/models/repo-info.js @@ -6,19 +6,16 @@ class RepoInfo { this.repo_name = object.repo_name; this.permission = object.permission; this.size = Utils.bytesToSize(object.size); + this.file_count = object.file_count; this.owner_name = object.owner_name; this.owner_email = object.owner_email; - this.owner_contact_email = object.owner_contact_name; + this.owner_contact_email = object.owner_contact_email; this.is_admin = object.is_admin; + this.is_virtual = object.is_virtual; + this.no_quota = object.no_quota; + this.has_been_shared_out = object.has_been_shared_out; this.encrypted = object.encrypted; - this.last_modified = object.last_modified; - this.modifier_contact_email = object.modifier_contact_email; - this.modifier_email = object.modifier_email; - this.modifier_name = object.modifier_name; - this.mtime = object.mtime; } } export default RepoInfo; - -//todo rename to repo, and rename repo to repoInfo diff --git a/frontend/src/models/repo.js b/frontend/src/models/repo.js index 5a8cd58d19..826cea4bdd 100644 --- a/frontend/src/models/repo.js +++ b/frontend/src/models/repo.js @@ -6,15 +6,16 @@ class Repo { this.repo_name = object.repo_name; this.permission = object.permission; this.size = Utils.bytesToSize(object.size); - this.file_count = object.file_count; this.owner_name = object.owner_name; this.owner_email = object.owner_email; this.owner_contact_email = object.owner_contact_email; this.is_admin = object.is_admin; - this.is_virtual = object.is_virtual; - this.no_quota = object.no_quota; - this.has_been_shared_out = object.has_been_shared_out; this.encrypted = object.encrypted; + this.last_modified = object.last_modified; + this.modifier_contact_email = object.modifier_contact_email; + this.modifier_email = object.modifier_email; + this.modifier_name = object.modifier_name; + this.mtime = object.mtime; } } diff --git a/frontend/src/pages/groups/group-view.js b/frontend/src/pages/groups/group-view.js index 18f6e208e3..c71a63ead8 100644 --- a/frontend/src/pages/groups/group-view.js +++ b/frontend/src/pages/groups/group-view.js @@ -6,7 +6,7 @@ import { seafileAPI } from '../../utils/seafile-api'; import Loading from '../../components/loading'; import ModalPortal from '../../components/modal-portal'; import Group from '../../models/group'; -import RepoInfo from '../../models/repoInfo'; +import Repo from '../../models/repo'; import CommonToolbar from '../../components/toolbar/common-toolbar'; import CreateRepoDialog from '../../components/dialog/create-repo-dialog'; import CreateDepartmentRepoDialog from '../../components/dialog/create-department-repo-dialog'; @@ -87,8 +87,8 @@ class GroupView extends React.Component { this.setState({isLoading: true}); seafileAPI.listGroupRepos(groupID).then((res) => { let repoList = res.data.map(item => { - let repoInfo = new RepoInfo(item); - return repoInfo; + let repo = new Repo(item); + return repo; }); this.setState({ isLoading: false, @@ -166,7 +166,7 @@ class GroupView extends React.Component { size: res.data.size, encrypted: res.data.encrypted, }; - let repo = new RepoInfo(object); + let repo = new Repo(object); let repoList = this.addRepoItem(repo); this.setState({repoList: repoList}); }).then(() => { @@ -175,7 +175,7 @@ class GroupView extends React.Component { } else { seafileAPI.createGroupRepo(groupId, repo).then(res => { - let repo = new RepoInfo(res.data); + let repo = new Repo(res.data); let repoList = this.addRepoItem(repo); this.setState({repoList: repoList}); }).catch(() => { diff --git a/frontend/src/pages/groups/groups-view.js b/frontend/src/pages/groups/groups-view.js index b5f1eb4706..915cc909c0 100644 --- a/frontend/src/pages/groups/groups-view.js +++ b/frontend/src/pages/groups/groups-view.js @@ -4,7 +4,7 @@ import { gettext, siteRoot, loginUrl } from '../../utils/constants'; import { seafileAPI } from '../../utils/seafile-api'; import Loading from '../../components/loading'; import Group from '../../models/group'; -import RepoInfo from '../../models/repoInfo'; +import Repo from '../../models/repo'; import GroupsToolbar from '../../components/toolbar/groups-toolbar'; import SharedRepoListView from '../../components/shared-repo-list-view/shared-repo-list-view'; import CreateGroupDialog from '../../components/dialog/create-group-dialog'; @@ -28,7 +28,7 @@ class RepoListViewPanel extends React.Component { componentDidMount() { let group = this.props.group; let repoList = group.repos.map(item => { - let repo = new RepoInfo(item); + let repo = new Repo(item); return repo; }); this.setState({repoList: repoList}); diff --git a/frontend/src/pages/repo-wiki-mode/main-panel.js b/frontend/src/pages/repo-wiki-mode/main-panel.js index 4222f0e39b..ee1e9e3396 100644 --- a/frontend/src/pages/repo-wiki-mode/main-panel.js +++ b/frontend/src/pages/repo-wiki-mode/main-panel.js @@ -4,7 +4,7 @@ import cookie from 'react-cookies'; import { gettext, repoID, siteRoot, permission } from '../../utils/constants'; import { seafileAPI } from '../../utils/seafile-api'; import { Utils } from '../../utils/utils'; -import Repo from '../../models/repo'; +import RepoInfo from '../../models/repo-info'; import CommonToolbar from '../../components/toolbar/common-toolbar'; import ViewModeToolbar from '../../components/toolbar/view-mode-toolbar'; import DirOperationToolBar from '../../components/toolbar/dir-operation-toolbar'; @@ -66,7 +66,7 @@ class MainPanel extends Component { isDirentDetailShow: false, currentDirent: null, direntPath: '', - currentRepo: null, + currentRepoInfo: null, isRepoOwner: false, activeTitleIndex: -1, }; @@ -76,12 +76,12 @@ class MainPanel extends Component { componentDidMount() { seafileAPI.getRepoInfo(repoID).then(res => { - let repo = new Repo(res.data); + let repoInfo = new RepoInfo(res.data); seafileAPI.getAccountInfo().then(res => { let user_email = res.data.email; - let isRepoOwner = repo.owner_email === user_email; + let isRepoOwner = repoInfo.owner_email === user_email; this.setState({ - currentRepo: repo, + currentRepoInfo: repoInfo, isRepoOwner: isRepoOwner, }); }); @@ -210,10 +210,10 @@ class MainPanel extends Component {
- {this.state.currentRepo && ( + {this.state.currentRepoInfo && (