1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-05-09 16:38:20 +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
frontend/src
seahub/api2/endpoints/admin

View File

@ -14,6 +14,7 @@ const propTypes = {
isOpen: PropTypes.bool.isRequired,
onToggle: PropTypes.func.isRequired,
searchUsersFunc: PropTypes.func.isRequired,
searchGroupsFunc: PropTypes.func
};
class LogUserSelector extends Component {
@ -71,6 +72,15 @@ class LogUserSelector extends Component {
this.setState({
searchResults: users,
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) => {
this.setState({
@ -132,7 +142,10 @@ class LogUserSelector extends Component {
</li>
) : (
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 (
<li key={index}
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: [],
selectedFromUsers: [],
selectedToUsers: [],
selectedToGroups: [],
selectedOperators: [],
openSelector: null,
availableRepos: [],
@ -187,10 +188,19 @@ class FIleTransferLogs extends Component {
}
getLogsByPage = (page) => {
let { perPage, selectedFromUsers, selectedToUsers, selectedOperators, selectedRepos } = this.state;
let {
perPage,
selectedFromUsers,
selectedToUsers,
selectedToGroups,
selectedOperators,
selectedRepos
} = this.state;
const emails = {
from_emails: selectedFromUsers.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)
};
@ -246,23 +256,51 @@ class FIleTransferLogs extends Component {
});
};
handleToUserFilter = (user, shouldFetchData = true) => {
const { selectedToUsers } = this.state;
let newSelectedUsers;
handleToUserFilter = (item, shouldFetchData = true) => {
const { selectedToUsers, selectedToGroups } = this.state;
let newSelectedUsers = selectedToUsers;
let newSelectedGroups = selectedToGroups;
if (user === null) {
if (item === null) {
newSelectedUsers = selectedToUsers;
newSelectedGroups = selectedToGroups;
} else {
const isSelected = selectedToUsers.find(item => item.email === user.email);
if (isSelected) {
newSelectedUsers = selectedToUsers.filter(item => item.email !== user.email);
if (item.email) {
const isSelected = selectedToUsers.find(user => user.email === item.email);
if (isSelected) {
newSelectedUsers = selectedToUsers.filter(user => user.email !== item.email);
} else {
newSelectedUsers = [...selectedToUsers, item];
}
} else {
newSelectedUsers = [...selectedToUsers, user];
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({
selectedToUsers: newSelectedUsers,
selectedToGroups: newSelectedGroups,
currentPage: 1
}, () => {
if (shouldFetchData) {
@ -339,6 +377,10 @@ class FIleTransferLogs extends Component {
return systemAdminAPI.sysAdminSearchUsers(value);
};
searchGroups = (value) => {
return systemAdminAPI.sysAdminSearchGroups(value);
};
searchRepos = (value) => {
return systemAdminAPI.sysAdminSearchRepos(value);
};
@ -346,11 +388,23 @@ class FIleTransferLogs extends Component {
render() {
let {
logList, currentPage, perPage, hasNextPage,
availableUsers, selectedFromUsers, selectedToUsers, selectedOperators,
availableUsers, selectedFromUsers,
selectedToUsers, selectedToGroups,
selectedOperators,
availableRepos, selectedRepos,
openSelector
} = 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 (
<Fragment>
<MainPanelTopbar {...this.props} />
@ -372,11 +426,12 @@ class FIleTransferLogs extends Component {
<LogUserSelector
componentName="Transfer To"
items={availableUsers}
selectedItems={selectedToUsers}
selectedItems={selectedToItems}
onSelect={this.handleToUserFilter}
isOpen={openSelector === 'toUser'}
onToggle={() => this.handleSelectorToggle('toUser')}
searchUsersFunc={this.searchUsers}
searchGroupsFunc={this.searchGroups}
/>
<LogUserSelector
componentName="Operator"

View File

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

View File

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

View File

@ -314,9 +314,13 @@ class AdminLogsSharePermissionLogs(APIView):
if not is_valid_email(user_selected):
error_msg = 'email %s invalid.' % user_selected
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 = {
'from_emails': from_emails,
'to_emails': to_emails
'to_emails': to_emails,
'to_groups': to_groups
}
repos = request.GET.get('repos', None)
@ -489,7 +493,9 @@ class AdminLogsFileTransferLogs(APIView):
if not is_valid_email(user_selected):
error_msg = 'email %s invalid.' % user_selected
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)
if repos:
repos = repos.split(',')
@ -501,8 +507,8 @@ class AdminLogsFileTransferLogs(APIView):
queryset = RepoTransfer.objects.all()
if from_emails:
queryset = queryset.by_from_user(from_emails)
if to_emails:
queryset = queryset.by_to_user(to_emails)
if to_emails or to_groups:
queryset = queryset.by_to_user(to_emails + to_groups)
if operator_emails:
queryset = queryset.by_operator(operator_emails)
if repos: