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:
@@ -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 (
|
||||||
|
@@ -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,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -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}
|
||||||
/>
|
/>
|
||||||
|
@@ -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})
|
||||||
|
Reference in New Issue
Block a user