import React, { Component } from 'react'; import cookie from 'react-cookies'; import { seafileAPI } from '../../utils/seafile-api'; import { gettext, canAddRepo, canViewOrg } 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 ViewModes from '../../components/view-modes'; import ReposSortMenu from '../../components/repos-sort-menu'; import SingleDropdownToolbar from '../../components/toolbar/single-dropdown-toolbar'; import SortOptionsDialog from '../../components/dialog/sort-options'; import GuideForNewDialog from '../../components/dialog/guide-for-new-dialog'; import CreateRepoDialog from '../../components/dialog/create-repo-dialog'; import MylibRepoListView from '../../pages/my-libs/mylib-repo-list-view'; import SharedLibs from '../../pages/shared-libs/shared-libs'; import SharedWithAll from '../../pages/shared-with-all'; import GroupItem from '../../pages/groups/group-item'; import { LIST_MODE } from '../../components/dir-view-mode/constants'; import '../../css/files.css'; class Libraries extends Component { constructor(props) { super(props); this.sortOptions = [ { value: 'name-asc', text: gettext('By name ascending') }, { value: 'name-desc', text: gettext('By name descending') }, { value: 'time-asc', text: gettext('By time ascending') }, { value: 'time-desc', text: gettext('By time descending') } ]; this.state = { // for 'my libs' errorMsg: '', isLoading: true, repoList: [], isSortOptionsDialogOpen: false, isGuideForNewDialogOpen: window.app.pageOptions.guideEnabled, groupList: [], sharedRepoList: [], publicRepoList: [], isCreateRepoDialogOpen: false, currentViewMode: localStorage.getItem('sf_repo_list_view_mode') || LIST_MODE, sortBy: localStorage.getItem('sf_repos_sort_by') || 'name', // 'name' or 'time' sortOrder: localStorage.getItem('sf_repos_sort_order') || 'asc', // 'asc' or 'desc' }; } componentDidMount() { const promiseListRepos = seafileAPI.listRepos({ 'type': ['mine', 'shared', 'public'] }); const promiseListGroups = seafileAPI.listGroups(true); Promise.all([promiseListRepos, promiseListGroups]).then(res => { const [resListRepos, resListGroups] = res; const repoList = resListRepos.data.repos.map((item) => new Repo(item)); const groups = resListGroups.data.map(item => { let group = new Group(item); group.repos = item.repos.map(item => new Repo(item)); return group; }).sort((a, b) => a.name.toLowerCase() < b.name.toLowerCase() ? -1 : 1); const { allRepoList, myRepoList, sharedRepoList, publicRepoList, groupList } = this.sortRepos(repoList, groups); this.setState({ isLoading: false, allRepoList, groupList, sharedRepoList, publicRepoList, repoList: myRepoList }); }).catch((error) => { this.setState({ isLoading: false, errorMsg: Utils.getErrorMsg(error, true), }); }); } sortRepos = (repoList, groups) => { const allRepoList = Utils.sortRepos(repoList, this.state.sortBy, this.state.sortOrder); const myRepoList = allRepoList.filter(item => item.type === 'mine'); const sharedRepoList = allRepoList.filter(item => item.type === 'shared'); const publicRepoList = allRepoList.filter(item => item.type === 'public'); const groupList = groups.map(item => { item.repos = Utils.sortRepos(item.repos, this.state.sortBy, this.state.sortOrder); return item; }); return { allRepoList, myRepoList, sharedRepoList, publicRepoList, groupList }; }; toggleSortOptionsDialog = () => { this.setState({ isSortOptionsDialogOpen: !this.state.isSortOptionsDialogOpen }); }; onCreateRepo = (repo) => { this.toggleCreateRepoDialog(); 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); }); }; onSelectSortOption = (sortOption) => { const [sortBy, sortOrder] = sortOption.value.split('-'); this.setState({ sortBy, sortOrder }, () => { localStorage.setItem('sf_repos_sort_by', sortBy); localStorage.setItem('sf_repos_sort_order', sortOrder); const { allRepoList: repoList, groupList: groups } = this.state; const { allRepoList, myRepoList, sharedRepoList, publicRepoList, groupList } = this.sortRepos(repoList, groups); this.setState({ allRepoList, groupList, sharedRepoList, publicRepoList, repoList: myRepoList }); }); }; 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 }); }; onGroupTransferRepo = (repoID, oldGroupID, newOwner) => { let newGroupID = parseInt(newOwner.split('@')[0]); let repoToMove = null; const updatedGroups = this.state.groupList.map(group => { if (group.id === oldGroupID) { group.repos = group.repos.filter(repo => { if (repo.repo_id === repoID) { repoToMove = repo; return false; } return true; }); } return group; }); if (repoToMove) { updatedGroups.forEach(group => { if (group.id === newGroupID) { group.repos.push(repoToMove); } }); } this.setState({ groupList: updatedGroups }); }; 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' /* 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; }) }); }; toggleCreateRepoDialog = () => { this.setState({ isCreateRepoDialogOpen: !this.state.isCreateRepoDialogOpen }); }; switchViewMode = (newMode) => { this.setState({ currentViewMode: newMode }, () => { localStorage.setItem('sf_repo_list_view_mode', newMode); }); }; render() { const { isLoading, currentViewMode, sortBy, sortOrder } = this.state; const isDesktop = Utils.isDesktop(); const sortOptions = this.sortOptions.map(item => { return { ...item, isSelected: item.value == `${sortBy}-${sortOrder}` }; }); return ( <>

{gettext('Files')}

{isDesktop &&
}
{isLoading ? :
{(Utils.isDesktop() && currentViewMode == LIST_MODE) && (
{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.errorMsg ?

{this.state.errorMsg}

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

{gettext('No libraries')}

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