1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-08-12 12:22:13 +00:00

optimize filter

This commit is contained in:
孙永强 2025-03-25 11:44:13 +08:00
parent b29f2438f3
commit d1b1cdd2e1
5 changed files with 136 additions and 31 deletions

View File

@ -14,6 +14,7 @@ const propTypes = {
isOpen: PropTypes.bool.isRequired, isOpen: PropTypes.bool.isRequired,
onToggle: PropTypes.func.isRequired, onToggle: PropTypes.func.isRequired,
searchUsersFunc: PropTypes.func.isRequired, searchUsersFunc: PropTypes.func.isRequired,
searchGroupsFunc: PropTypes.func
}; };
class LogUserSelector extends Component { class LogUserSelector extends Component {
@ -71,6 +72,15 @@ class LogUserSelector extends Component {
this.setState({ this.setState({
searchResults: users, searchResults: users,
isLoading: false isLoading: false
}, () => {
if (this.props.searchGroupsFunc) {
this.props.searchGroupsFunc(value).then((res) => {
const groups = res.data.group_list || res.data.groups || [];
this.setState({
searchResults: [...users, ...groups]
});
});
}
}); });
}).catch((error) => { }).catch((error) => {
this.setState({ this.setState({
@ -132,7 +142,10 @@ class LogUserSelector extends Component {
</li> </li>
) : ( ) : (
displayItems.map((item, index) => { displayItems.map((item, index) => {
const isSelected = selectedItems.some(selected => selected.email === item.email); const isSelected = selectedItems.some(selected =>
(item.email && selected.email === item.email) ||
(item.id && selected.id === item.id)
);
return ( return (
<li key={index} <li key={index}
className="activity-user-item h-6 p-1 rounded d-flex justify-content-between align-items-center" className="activity-user-item h-6 p-1 rounded d-flex justify-content-between align-items-center"

View File

@ -167,6 +167,7 @@ class FIleTransferLogs extends Component {
availableUsers: [], availableUsers: [],
selectedFromUsers: [], selectedFromUsers: [],
selectedToUsers: [], selectedToUsers: [],
selectedToGroups: [],
selectedOperators: [], selectedOperators: [],
openSelector: null, openSelector: null,
availableRepos: [], availableRepos: [],
@ -187,10 +188,19 @@ class FIleTransferLogs extends Component {
} }
getLogsByPage = (page) => { getLogsByPage = (page) => {
let { perPage, selectedFromUsers, selectedToUsers, selectedOperators, selectedRepos } = this.state; let {
perPage,
selectedFromUsers,
selectedToUsers,
selectedToGroups,
selectedOperators,
selectedRepos
} = this.state;
const emails = { const emails = {
from_emails: selectedFromUsers.map(user => user.email), from_emails: selectedFromUsers.map(user => user.email),
to_emails: selectedToUsers.map(user => user.email), to_emails: selectedToUsers.map(user => user.email),
to_groups: selectedToGroups.map(group => group.to_group_id || group.id),
operator_emails: selectedOperators.map(user => user.email) operator_emails: selectedOperators.map(user => user.email)
}; };
@ -246,23 +256,51 @@ class FIleTransferLogs extends Component {
}); });
}; };
handleToUserFilter = (user, shouldFetchData = true) => { handleToUserFilter = (item, shouldFetchData = true) => {
const { selectedToUsers } = this.state; const { selectedToUsers, selectedToGroups } = this.state;
let newSelectedUsers; let newSelectedUsers = selectedToUsers;
let newSelectedGroups = selectedToGroups;
if (user === null) { if (item === null) {
newSelectedUsers = selectedToUsers; newSelectedUsers = selectedToUsers;
newSelectedGroups = selectedToGroups;
} else { } else {
const isSelected = selectedToUsers.find(item => item.email === user.email); if (item.email) {
const isSelected = selectedToUsers.find(user => user.email === item.email);
if (isSelected) { if (isSelected) {
newSelectedUsers = selectedToUsers.filter(item => item.email !== user.email); newSelectedUsers = selectedToUsers.filter(user => user.email !== item.email);
} else { } else {
newSelectedUsers = [...selectedToUsers, user]; newSelectedUsers = [...selectedToUsers, item];
}
} else {
const groupId = item.to_group_id || item.id;
const groupName = item.to_group_name || item.name;
const isSelected = selectedToGroups.find(group => {
const selectedGroupId = group.to_group_id || group.id;
return selectedGroupId === groupId;
});
if (isSelected) {
newSelectedGroups = selectedToGroups.filter(group => {
const selectedGroupId = group.to_group_id || group.id;
return selectedGroupId !== groupId;
});
} else {
const groupItem = {
id: groupId,
name: groupName,
to_group_id: groupId,
to_group_name: groupName
};
newSelectedGroups = [...selectedToGroups, groupItem];
}
} }
} }
this.setState({ this.setState({
selectedToUsers: newSelectedUsers, selectedToUsers: newSelectedUsers,
selectedToGroups: newSelectedGroups,
currentPage: 1 currentPage: 1
}, () => { }, () => {
if (shouldFetchData) { if (shouldFetchData) {
@ -339,6 +377,10 @@ class FIleTransferLogs extends Component {
return systemAdminAPI.sysAdminSearchUsers(value); return systemAdminAPI.sysAdminSearchUsers(value);
}; };
searchGroups = (value) => {
return systemAdminAPI.sysAdminSearchGroups(value);
};
searchRepos = (value) => { searchRepos = (value) => {
return systemAdminAPI.sysAdminSearchRepos(value); return systemAdminAPI.sysAdminSearchRepos(value);
}; };
@ -346,11 +388,23 @@ class FIleTransferLogs extends Component {
render() { render() {
let { let {
logList, currentPage, perPage, hasNextPage, logList, currentPage, perPage, hasNextPage,
availableUsers, selectedFromUsers, selectedToUsers, selectedOperators, availableUsers, selectedFromUsers,
selectedToUsers, selectedToGroups,
selectedOperators,
availableRepos, selectedRepos, availableRepos, selectedRepos,
openSelector openSelector
} = this.state; } = this.state;
const selectedToItems = [
...selectedToUsers,
...selectedToGroups.map(group => ({
id: group.to_group_id || group.id,
name: group.to_group_name || group.name,
to_group_id: group.to_group_id || group.id,
to_group_name: group.to_group_name || group.name
}))
];
return ( return (
<Fragment> <Fragment>
<MainPanelTopbar {...this.props} /> <MainPanelTopbar {...this.props} />
@ -372,11 +426,12 @@ class FIleTransferLogs extends Component {
<LogUserSelector <LogUserSelector
componentName="Transfer To" componentName="Transfer To"
items={availableUsers} items={availableUsers}
selectedItems={selectedToUsers} selectedItems={selectedToItems}
onSelect={this.handleToUserFilter} onSelect={this.handleToUserFilter}
isOpen={openSelector === 'toUser'} isOpen={openSelector === 'toUser'}
onToggle={() => this.handleSelectorToggle('toUser')} onToggle={() => this.handleSelectorToggle('toUser')}
searchUsersFunc={this.searchUsers} searchUsersFunc={this.searchUsers}
searchGroupsFunc={this.searchGroups}
/> />
<LogUserSelector <LogUserSelector
componentName="Operator" componentName="Operator"

View File

@ -156,6 +156,7 @@ class SharePermissionLogs extends Component {
availableUsers: [], availableUsers: [],
selectedFromUsers: [], selectedFromUsers: [],
selectedToUsers: [], selectedToUsers: [],
selectedToGroups: [],
availableRepos: [], availableRepos: [],
selectedRepos: [], selectedRepos: [],
openSelector: null, openSelector: null,
@ -179,13 +180,20 @@ class SharePermissionLogs extends Component {
} }
getLogsByPage = (page) => { getLogsByPage = (page) => {
let { perPage, selectedFromUsers, selectedToUsers, selectedRepos } = this.state; let {
let fromEmails = selectedFromUsers.map(user => user.email); perPage,
let toEmails = selectedToUsers.map(user => user.email); selectedFromUsers,
selectedToUsers,
selectedToGroups,
selectedRepos
} = this.state;
const emails = { const emails = {
from_emails: fromEmails, from_emails: selectedFromUsers.map(user => user.email),
to_emails: toEmails to_emails: selectedToUsers.map(user => user.email),
to_groups: selectedToGroups.map(group => group.id)
}; };
systemAdminAPI.sysAdminListSharePermissionLogs( systemAdminAPI.sysAdminListSharePermissionLogs(
page, page,
perPage, perPage,
@ -237,23 +245,35 @@ class SharePermissionLogs extends Component {
}); });
}; };
handleToUserFilter = (user, shouldFetchData = true) => { handleToUserFilter = (item, shouldFetchData = true) => {
const { selectedToUsers } = this.state; const { selectedToUsers, selectedToGroups } = this.state;
let newSelectedUsers; let newSelectedUsers = selectedToUsers;
let newSelectedGroups = selectedToGroups;
if (user === null) { if (item === null) {
newSelectedUsers = selectedToUsers; newSelectedUsers = selectedToUsers;
newSelectedGroups = selectedToGroups;
} else { } else {
const isSelected = selectedToUsers.find(item => item.email === user.email); if (item.email) {
const isSelected = selectedToUsers.find(user => user.email === item.email);
if (isSelected) { if (isSelected) {
newSelectedUsers = selectedToUsers.filter(item => item.email !== user.email); newSelectedUsers = selectedToUsers.filter(user => user.email !== item.email);
} else { } else {
newSelectedUsers = [...selectedToUsers, user]; newSelectedUsers = [...selectedToUsers, item];
}
} else {
const isSelected = selectedToGroups.find(group => group.id === item.id);
if (isSelected) {
newSelectedGroups = selectedToGroups.filter(group => group.id !== item.id);
} else {
newSelectedGroups = [...selectedToGroups, item];
}
} }
} }
this.setState({ this.setState({
selectedToUsers: newSelectedUsers, selectedToUsers: newSelectedUsers,
selectedToGroups: newSelectedGroups,
currentPage: 1 currentPage: 1
}, () => { }, () => {
if (shouldFetchData) { if (shouldFetchData) {
@ -308,11 +328,15 @@ class SharePermissionLogs extends Component {
return systemAdminAPI.sysAdminSearchRepos(value); return systemAdminAPI.sysAdminSearchRepos(value);
}; };
searchGroups = (value) => {
return systemAdminAPI.sysAdminSearchGroups(value);
};
render() { render() {
let { let {
logList, currentPage, perPage, hasNextPage, isExportExcelDialogOpen, logList, currentPage, perPage, hasNextPage, isExportExcelDialogOpen,
availableUsers, selectedFromUsers, selectedToUsers, availableUsers, selectedFromUsers, selectedToUsers,
availableRepos, selectedRepos, openSelector selectedToGroups, availableRepos, selectedRepos, openSelector
} = this.state; } = this.state;
return ( return (
<Fragment> <Fragment>
@ -337,11 +361,12 @@ class SharePermissionLogs extends Component {
<LogUserSelector <LogUserSelector
componentName="Share To" componentName="Share To"
items={availableUsers} items={availableUsers}
selectedItems={selectedToUsers} selectedItems={[...selectedToUsers, ...selectedToGroups]}
onSelect={this.handleToUserFilter} onSelect={this.handleToUserFilter}
isOpen={openSelector === 'toUser'} isOpen={openSelector === 'toUser'}
onToggle={() => this.handleSelectorToggle('toUser')} onToggle={() => this.handleSelectorToggle('toUser')}
searchUsersFunc={this.searchUsers} searchUsersFunc={this.searchUsers}
searchGroupsFunc={this.searchGroups}
/> />
<div className="mx-3"></div> <div className="mx-3"></div>
<LogRepoSelector <LogRepoSelector

View File

@ -734,6 +734,9 @@ class SystemAdminAPI {
if (emails.to_emails && emails.to_emails.length) { if (emails.to_emails && emails.to_emails.length) {
params.to_emails = emails.to_emails.join(','); params.to_emails = emails.to_emails.join(',');
} }
if (emails.to_groups && emails.to_groups.length) {
params.to_groups = emails.to_groups.join(',');
}
if (repos && repos.length) { if (repos && repos.length) {
params.repos = repos.map(repo => repo.id).join(','); params.repos = repos.map(repo => repo.id).join(',');
} }
@ -755,6 +758,9 @@ class SystemAdminAPI {
if (emails.operator_emails && emails.operator_emails.length) { if (emails.operator_emails && emails.operator_emails.length) {
params.operator_emails = emails.operator_emails.join(','); params.operator_emails = emails.operator_emails.join(',');
} }
if (emails.to_groups && emails.to_groups.length) {
params.to_groups = emails.to_groups.join(',');
}
if (repos && repos.length) { if (repos && repos.length) {
params.repos = repos.map(repo => repo.id).join(','); params.repos = repos.map(repo => repo.id).join(',');
} }

View File

@ -314,9 +314,13 @@ class AdminLogsSharePermissionLogs(APIView):
if not is_valid_email(user_selected): if not is_valid_email(user_selected):
error_msg = 'email %s invalid.' % user_selected error_msg = 'email %s invalid.' % user_selected
return api_error(status.HTTP_400_BAD_REQUEST, error_msg) return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
to_groups = request.GET.get('to_groups')
to_groups = to_groups.split(',') if to_groups else []
emails = { emails = {
'from_emails': from_emails, 'from_emails': from_emails,
'to_emails': to_emails 'to_emails': to_emails,
'to_groups': to_groups
} }
repos = request.GET.get('repos', None) repos = request.GET.get('repos', None)
@ -489,7 +493,9 @@ class AdminLogsFileTransferLogs(APIView):
if not is_valid_email(user_selected): if not is_valid_email(user_selected):
error_msg = 'email %s invalid.' % user_selected error_msg = 'email %s invalid.' % user_selected
return api_error(status.HTTP_400_BAD_REQUEST, error_msg) return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
to_groups = request.GET.get('to_groups')
to_groups = to_groups.split(',') if to_groups else []
to_groups = [group_id + '@seafile_group' for group_id in to_groups]
repos = request.GET.get('repos', None) repos = request.GET.get('repos', None)
if repos: if repos:
repos = repos.split(',') repos = repos.split(',')
@ -501,8 +507,8 @@ class AdminLogsFileTransferLogs(APIView):
queryset = RepoTransfer.objects.all() queryset = RepoTransfer.objects.all()
if from_emails: if from_emails:
queryset = queryset.by_from_user(from_emails) queryset = queryset.by_from_user(from_emails)
if to_emails: if to_emails or to_groups:
queryset = queryset.by_to_user(to_emails) queryset = queryset.by_to_user(to_emails + to_groups)
if operator_emails: if operator_emails:
queryset = queryset.by_operator(operator_emails) queryset = queryset.by_operator(operator_emails)
if repos: if repos: