import React, { Component, Fragment } from 'react'; import { navigate } from '@gatsbyjs/reach-router'; import { Button } from 'reactstrap'; import { Utils } from '../../../utils/utils'; import { seafileAPI } from '../../../utils/seafile-api'; import { gettext, siteRoot } from '../../../utils/constants'; import toaster from '../../../components/toast'; import SysAdminCreateRepoDialog from '../../../components/dialog/sysadmin-dialog/sysadmin-create-repo-dialog'; import MainPanelTopbar from '../main-panel-topbar'; import Search from '../search'; import ReposNav from './repos-nav'; import Content from './repos'; class AllRepos extends Component { constructor(props) { super(props); this.state = { loading: true, errorMsg: '', repos: [], pageInfo: {}, perPage: 25, sortBy: '', isCreateRepoDialogOpen: false }; } componentDidMount () { let urlParams = (new URL(window.location)).searchParams; const { currentPage = 1, perPage, sortBy } = this.state; this.setState({ sortBy: urlParams.get('order_by') || sortBy, perPage: parseInt(urlParams.get('per_page') || perPage), currentPage: parseInt(urlParams.get('page') || currentPage) }, () => { this.getReposByPage(this.state.currentPage); }); } toggleCreateRepoDialog = () => { this.setState({isCreateRepoDialogOpen: !this.state.isCreateRepoDialogOpen}); }; getReposByPage = (page) => { const { perPage, sortBy } = this.state; seafileAPI.sysAdminListAllRepos(page, perPage, sortBy).then((res) => { this.setState({ loading: false, repos: res.data.repos, pageInfo: res.data.page_info }); }).catch((error) => { this.setState({ loading: false, errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403 }); }); }; sortItems = (sortBy) => { this.setState({ currentPage: 1, sortBy: sortBy }, () => { let url = new URL(location.href); let searchParams = new URLSearchParams(url.search); const { currentPage, sortBy } = this.state; searchParams.set('page', currentPage); searchParams.set('order_by', sortBy); url.search = searchParams.toString(); navigate(url.toString()); this.getReposByPage(currentPage); }); }; resetPerPage = (perPage) => { this.setState({ perPage: perPage }, () => { this.getReposByPage(1); }); }; createRepo = (repoName, Owner) => { seafileAPI.sysAdminCreateRepo(repoName, Owner).then(res => { this.state.repos.unshift(res.data); this.setState({ repos: this.state.repos }); }).catch(error => { let errMessage = Utils.getErrorMsg(error); toaster.danger(errMessage); }); }; onDeleteRepo = (targetRepo) => { let repos = this.state.repos.filter(repo => { return repo.id != targetRepo.id; }); this.setState({ repos: repos }); }; onTransferRepo = (targetRepo) => { let repos = this.state.repos.map((item) => { return item.id == targetRepo.id ? targetRepo : item; }); this.setState({ repos: repos }); }; getSearch = () => { return ; }; searchRepos = (repoNameOrID) => { if (this.getValueLength(repoNameOrID) < 3) { toaster.notify(gettext('Required at least three letters.')); return; } navigate(`${siteRoot}sys/search-libraries/?name_or_id=${encodeURIComponent(repoNameOrID)}`); }; getValueLength(str) { let code, len = 0; for (let i = 0, length = str.length; i < length; i++) { code = str.charCodeAt(i); if (code === 10) { //solve enter problem len += 2; } else if (code < 0x007f) { len += 1; } else if (code >= 0x0080 && code <= 0x07ff) { len += 2; } else if (code >= 0x0800 && code <= 0xffff) { len += 3; } } return len; } render() { let { isCreateRepoDialogOpen } = this.state; return (
{isCreateRepoDialogOpen && }
); } } export default AllRepos;