1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-09-11 20:01:10 +00:00

improve admin search repos (#5726)

This commit is contained in:
WJH
2023-11-04 17:44:26 +08:00
committed by GitHub
parent 575a0ba516
commit ac7366f939
4 changed files with 114 additions and 15 deletions

View File

@@ -120,9 +120,30 @@ class AllRepos extends Component {
}; };
searchRepos = (repoNameOrID) => { 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)}`); 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() { render() {
let { isCreateRepoDialogOpen } = this.state; let { isCreateRepoDialogOpen } = this.state;
return ( return (

View File

@@ -132,8 +132,8 @@ Content.propTypes = {
resetPerPage: PropTypes.func, resetPerPage: PropTypes.func,
pageInfo: PropTypes.object, pageInfo: PropTypes.object,
curPerPage: PropTypes.number, curPerPage: PropTypes.number,
sortItems: PropTypes.func.isRequired, sortItems: PropTypes.func,
sortBy: PropTypes.string.isRequired, sortBy: PropTypes.string,
onTransferRepo: PropTypes.func.isRequired, onTransferRepo: PropTypes.func.isRequired,
}; };

View File

@@ -2,6 +2,7 @@ import React, { Component, Fragment } from 'react';
import { Form, FormGroup, Input, Label, Col } from 'reactstrap'; import { Form, FormGroup, Input, Label, Col } from 'reactstrap';
import { seafileAPI } from '../../../utils/seafile-api'; import { seafileAPI } from '../../../utils/seafile-api';
import { gettext } from '../../../utils/constants'; import { gettext } from '../../../utils/constants';
import toaster from '../../../components/toast';
import { Utils } from '../../../utils/utils'; import { Utils } from '../../../utils/utils';
import MainPanelTopbar from '../main-panel-topbar'; import MainPanelTopbar from '../main-panel-topbar';
import Content from './repos'; import Content from './repos';
@@ -13,27 +14,36 @@ class SearchRepos extends Component {
super(props); super(props);
this.state = { this.state = {
name: '', name: '',
currentPage: 1,
perPage: 25,
isSubmitBtnActive: false, isSubmitBtnActive: false,
loading: true, loading: true,
errorMsg: '', errorMsg: '',
repos: [] repos: [],
pageInfo: {},
}; };
} }
componentDidMount() { componentDidMount() {
let params = (new URL(document.location)).searchParams; let params = (new URL(document.location)).searchParams;
const { currentPage, perPage } = this.state;
this.setState({ this.setState({
name: params.get('name_or_id') || '' name: params.get('name_or_id') || '',
}, this.getRepos); perPage: parseInt(params.get('per_page') || perPage),
currentPage: parseInt(params.get('page') || currentPage),
}, () => {
this.getRepos(this.state.currentPage);
});
} }
getRepos = () => { getRepos = (page) => {
const { name } = this.state; const { name, perPage } = this.state;
seafileAPI.sysAdminSearchRepos(name).then((res) => { seafileAPI.sysAdminSearchRepos(name, page, perPage).then((res) => {
this.setState({ this.setState({
loading: false, loading: false,
errorMsg: '', errorMsg: '',
repos: res.data.repo_list repos: res.data.repo_list,
pageInfo: res.data.page_info,
}); });
}).catch((error) => { }).catch((error) => {
this.setState({ this.setState({
@@ -44,7 +54,8 @@ class SearchRepos extends Component {
}; };
searchRepos = () => { searchRepos = () => {
this.getRepos(); const { currentPage } = this.state;
this.getRepos(currentPage);
}; };
onDeleteRepo = (targetRepo) => { onDeleteRepo = (targetRepo) => {
@@ -67,7 +78,8 @@ class SearchRepos extends Component {
handleNameInputChange = (e) => { handleNameInputChange = (e) => {
this.setState({ this.setState({
name: e.target.value name: e.target.value,
currentPage: 1,
}, this.checkSubmitBtnActive); }, this.checkSubmitBtnActive);
}; };
@@ -80,13 +92,43 @@ class SearchRepos extends Component {
handleKeyDown = (e) => { handleKeyDown = (e) => {
if (e.keyCode === 13) { if (e.keyCode === 13) {
const { isSubmitBtnActive } = this.state; const { isSubmitBtnActive, name } = this.state;
if (isSubmitBtnActive) { if (isSubmitBtnActive) {
if (this.getValueLength(name) < 3) {
toaster.notify(gettext('Required at least three letters.'));
return;
}
this.searchRepos(); this.searchRepos();
} }
} }
}; };
resetPerPage = (perPage) => {
this.setState({
perPage: perPage,
currentPage: 1,
}, () => {
this.searchRepos();
});
};
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() { render() {
const { name, isSubmitBtnActive } = this.state; const { name, isSubmitBtnActive } = this.state;
return ( return (
@@ -121,6 +163,10 @@ class SearchRepos extends Component {
loading={this.state.loading} loading={this.state.loading}
errorMsg={this.state.errorMsg} errorMsg={this.state.errorMsg}
items={this.state.repos} items={this.state.repos}
pageInfo={this.state.pageInfo}
curPerPage={this.state.perPage}
getListByPage={this.getRepos}
resetPerPage={this.resetPerPage}
onDeleteRepo={this.onDeleteRepo} onDeleteRepo={this.onDeleteRepo}
onTransferRepo={this.onTransferRepo} onTransferRepo={this.onTransferRepo}
/> />

View File

@@ -496,8 +496,36 @@ class AdminSearchLibrary(APIView):
error_msg = 'query invalid.' error_msg = 'query invalid.'
return api_error(status.HTTP_400_BAD_REQUEST, error_msg) return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
try:
current_page = int(request.GET.get('page', '1'))
per_page = int(request.GET.get('per_page', '25'))
except ValueError:
current_page = 1
per_page = 25
start = (current_page - 1) * per_page
end = current_page * per_page
limit = per_page + 1
repos = seafile_api.search_repos_by_name(query_str) repos = seafile_api.search_repos_by_name(query_str)
repos += seafile_api.get_repos_by_id_prefix(query_str) repos_count = len(repos)
if repos_count > end:
repos = repos[start: end]
has_next_page = True
else:
if start - repos_count > 0:
repos = list()
start = start - repos_count
else:
repos = repos[start: end]
start = 0
repos += seafile_api.get_repos_by_id_prefix(query_str, start, limit)
if len(repos) > per_page:
repos = repos[:per_page]
has_next_page = True
else:
has_next_page = False
default_repo_id = get_system_default_repo_id() default_repo_id = get_system_default_repo_id()
repos = [r for r in repos if not r.is_virtual] repos = [r for r in repos if not r.is_virtual]
@@ -546,7 +574,7 @@ class AdminSearchLibrary(APIView):
result = [] result = []
for repo in repos: for repo in repos:
info = {} info = dict()
info['id'] = repo.repo_id info['id'] = repo.repo_id
info['name'] = repo.repo_name info['name'] = repo.repo_name
@@ -561,4 +589,8 @@ class AdminSearchLibrary(APIView):
result.append(info) result.append(info)
return Response({"repo_list": result}) page_info = {
'has_next_page': has_next_page,
'current_page': current_page
}
return Response({"repo_list": result, "page_info": page_info})