import React, { Component, Fragment } from 'react'; import PropTypes from 'prop-types'; import cookie from 'react-cookies'; import { seafileAPI } from '../../utils/seafile-api'; import { gettext, canAddRepo, canViewOrg, canAddGroup } from '../../utils/constants'; import { Utils } from '../../utils/utils'; import toaster from '../../components/toast'; import Repo from '../../models/repo'; import Group from '../../models/group'; import Loading from '../../components/loading'; import TopToolbar from '../../components/toolbar/top-toolbar'; import MyLibsToolbar from '../../components/toolbar/my-libs-toolbar'; import GroupsToolbar from '../../components/toolbar/groups-toolbar'; import SortOptionsDialog from '../../components/dialog/sort-options'; import GuideForNewDialog from '../../components/dialog/guide-for-new-dialog'; import MylibRepoListView from '../../pages/my-libs/mylib-repo-list-view'; import SharedLibs from '../../pages/shared-libs/shared-libs.js'; import SharedWithAll from '../../pages/shared-with-all'; import GroupItem from '../../pages/groups/group-item'; import '../../css/files.css'; const propTypes = { onShowSidePanel: PropTypes.func.isRequired, onSearchedClick: PropTypes.func.isRequired }; class Libraries extends Component { constructor(props) { super(props); this.state = { // for 'my libs' errorMsg: '', isLoading: true, repoList: [], isSortOptionsDialogOpen: false, sortBy: cookie.load('seafile-repo-dir-sort-by') || 'name', // 'name' or 'time' or 'size' sortOrder: cookie.load('seafile-repo-dir-sort-order') || 'asc', // 'asc' or 'desc' isGuideForNewDialogOpen: window.app.pageOptions.guideEnabled, // for 'groups' isGroupsLoading: true, groupsErrorMsg: '', groupList: [], // for 'shared' sharedRepoList:[], isSharedLoading: true, // for 'public' publicRepoList: [], isPublicLoading: true, }; } componentDidMount() { this.listMyLibs(); this.listGroups(); } listMyLibs = () => { seafileAPI.listRepos({'type':['mine', 'shared', 'public']}).then((res) => { let allRepoList = res.data.repos.map((item) => { return new Repo(item); }); let myRepoList = allRepoList.filter(item => { return item.type === 'mine'; }); let sharedRepoList = allRepoList.filter(item => { return item.type === 'shared'; }); let publicRepoList = allRepoList.filter(item => { return item.type === 'public'; }); this.setState({ isLoading: false, sharedRepoList: sharedRepoList, publicRepoList: publicRepoList, repoList: Utils.sortRepos(myRepoList, this.state.sortBy, this.state.sortOrder), },() => { this.setState({ isSharedLoading: false, isPublicLoading: false }); }); }).catch((error) => { this.setState({ isLoading: false, errorMsg: Utils.getErrorMsg(error, true), // true: show login tip if 403 }); }); }; toggleSortOptionsDialog = () => { this.setState({ isSortOptionsDialogOpen: !this.state.isSortOptionsDialogOpen }); }; onCreateRepo = (repo) => { seafileAPI.createMineRepo(repo).then((res) => { const newRepo = new Repo({ repo_id: res.data.repo_id, repo_name: res.data.repo_name, size: res.data.repo_size, mtime: res.data.mtime, owner_email: res.data.email, encrypted: res.data.encrypted, permission: res.data.permission, storage_name: res.data.storage_name }); this.state.repoList.unshift(newRepo); this.setState({repoList: this.state.repoList}); }).catch(error => { let errMessage = Utils.getErrorMsg(error); toaster.danger(errMessage); }); }; sortRepoList = (sortBy, sortOrder) => { cookie.save('seafile-repo-dir-sort-by', sortBy); cookie.save('seafile-repo-dir-sort-order', sortOrder); this.setState({ sortBy: sortBy, sortOrder: sortOrder, repoList: Utils.sortRepos(this.state.repoList, sortBy, sortOrder) }); }; onTransferRepo = (repoID) => { let repoList = this.state.repoList.filter(item => { return item.repo_id !== repoID; }); this.setState({repoList: repoList}); }; onRenameRepo = (repo, newName) => { let repoList = this.state.repoList.map(item => { if (item.repo_id === repo.repo_id) { item.repo_name = newName; } return item; }); this.setState({repoList: repoList}); }; onMonitorRepo = (repo, monitored) => { let repoList = this.state.repoList.map(item => { if (item.repo_id === repo.repo_id) { item.monitored = monitored; } return item; }); this.setState({repoList: repoList}); }; onDeleteRepo = (repo) => { let repoList = this.state.repoList.filter(item => { return item.repo_id !== repo.repo_id; }); this.setState({repoList: repoList}); }; toggleGuideForNewDialog = () => { window.app.pageOptions.guideEnabled = false; this.setState({ isGuideForNewDialogOpen: false }); }; // the following are for 'groups' listGroups = () => { seafileAPI.listGroups(true).then((res) => { // `{'with_repos': 1}`: list repos of every group let groupList = res.data.map(item => { let group = new Group(item); group.repos = item.repos.map(item => { return new Repo(item); }); return group; }); this.setState({ isGroupsLoading: false, groupList: groupList.sort((a, b) => { return a.name.toLowerCase() < b.name.toLowerCase() ? -1 : 1; }) }); }).catch((error) => { this.setState({ isGroupsLoading: false, groupsErrorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403 }); }); }; onCreateGroup = (groupData) => { const newGroup = new Group(groupData); const { groupList: newList } = this.state; newList.unshift(newGroup); this.setState({ groupList: newList }); }; updateGroup = (group) => { const { groupList } = this.state; this.setState({ groupList: groupList.map((item) => { if (item.id == group.id) { item = group; } return item; }) }); }; render() { return ( <> {canAddRepo && } {canAddGroup && }

{gettext('Files')}

{gettext('Library Type')} {gettext('Name')} {gettext('Actions')} {gettext('Size')} {gettext('Last Update')} {gettext('Owner')}
{canAddRepo && (

{gettext('My Libraries')}

{(!Utils.isDesktop() && this.state.repoList.length > 0) && }
{this.state.isLoading ? : ( this.state.errorMsg ?

{this.state.errorMsg}

: ( this.state.repoList.length === 0 ? (

{gettext('No libraries')}

) : ( )))}
)}
{!this.state.isSharedLoading && }
{canViewOrg && !this.state.isPublicLoading && (
)}
{this.state.isGroupsLoading? : ( this.state.groupsErrorMsg ?

{this.state.groupsErrorMsg}

: ( this.state.groupList.length > 0 && ( this.state.groupList.map((group, index) => { return ( ); }) )))}
{!this.state.isLoading && !this.state.errorMsg && this.state.isGuideForNewDialogOpen && } {this.state.isSortOptionsDialogOpen && }
); } } Libraries.propTypes = propTypes; export default Libraries;