import React, { Component, Fragment } from 'react';
import PropTypes from 'prop-types';
import { navigate } from '@gatsbyjs/reach-router';
import Nav from './org-users-nav';
import OrgUsersList from './org-users-list';
import MainPanelTopbar from './main-panel-topbar';
import ModalPortal from '../../components/modal-portal';
import ImportOrgUsersDialog from '../../components/dialog/org-import-users-dialog';
import AddOrgUserDialog from '../../components/dialog/org-add-user-dialog';
import InviteUserDialog from '../../components/dialog/org-admin-invite-user-dialog';
import toaster from '../../components/toast';
import { seafileAPI } from '../../utils/seafile-api';
import OrgUserInfo from '../../models/org-user';
import { gettext, invitationLink, orgID, siteRoot } from '../../utils/constants';
import { Utils } from '../../utils/utils';
class Search extends React.Component {
constructor(props) {
super(props);
this.state = {
value: ''
};
}
handleInputChange = (e) => {
this.setState({
value: e.target.value
});
};
handleKeyPress = (e) => {
if (e.key == 'Enter') {
e.preventDefault();
this.handleSubmit();
}
};
handleSubmit = () => {
const value = this.state.value.trim();
if (!value) {
return false;
}
this.props.submit(value);
};
render() {
return (
);
}
}
Search.propTypes = {
placeholder: PropTypes.string.isRequired,
submit: PropTypes.func.isRequired,
};
class OrgUsers extends Component {
constructor(props) {
super(props);
this.state = {
orgUsers: [],
page: 1,
pageNext: false,
sortBy: '',
sortOrder: 'asc',
isShowAddOrgUserDialog: false,
isImportOrgUsersDialogOpen: false,
isInviteUserDialogOpen: false
};
}
componentDidMount() {
let urlParams = (new URL(window.location)).searchParams;
const { page, sortBy, sortOrder } = this.state;
this.setState({
/*
perPage: parseInt(urlParams.get('per_page') || perPage),
currentPage: parseInt(urlParams.get('page') || currentPage),
*/
page: parseInt(urlParams.get('page') || page),
sortBy: urlParams.get('order_by') || sortBy,
sortOrder: urlParams.get('direction') || sortOrder
}, () => {
this.initOrgUsersData(this.state.page);
});
}
sortByQuotaUsage = () => {
this.setState({
sortBy: 'quota_usage',
sortOrder: this.state.sortOrder == 'asc' ? 'desc' : 'asc',
page: 1
}, () => {
let url = new URL(location.href);
let searchParams = new URLSearchParams(url.search);
const { page, sortBy, sortOrder } = this.state;
searchParams.set('page', page);
searchParams.set('order_by', sortBy);
searchParams.set('direction', sortOrder);
url.search = searchParams.toString();
navigate(url.toString());
this.initOrgUsersData(page);
});
};
toggleImportOrgUsersDialog = () => {
this.setState({isImportOrgUsersDialogOpen: !this.state.isImportOrgUsersDialogOpen});
};
toggleAddOrgUser = () => {
this.setState({isShowAddOrgUserDialog: !this.state.isShowAddOrgUserDialog});
};
toggleInviteUserDialog = () => {
this.setState({isInviteUserDialogOpen: !this.state.isInviteUserDialogOpen});
};
initOrgUsersData = (page) => {
const { sortBy, sortOrder } = this.state;
seafileAPI.orgAdminListOrgUsers(orgID, '', page, sortBy, sortOrder).then(res => {
let userList = res.data.user_list.map(item => {
return new OrgUserInfo(item);
});
this.setState({
orgUsers: userList,
pageNext: res.data.page_next,
page: res.data.page,
});
}).catch(error => {
let errMessage = Utils.getErrorMsg(error);
toaster.danger(errMessage);
});
};
importOrgUsers = (file) => {
toaster.notify(gettext('It may take some time, please wait.'));
seafileAPI.orgAdminImportUsersViaFile(orgID, file).then((res) => {
if (res.data.success.length) {
const users = res.data.success.map(item => {
if (item.institution == undefined) {
item.institution = '';
}
return new OrgUserInfo(item);
});
this.setState({
orgUsers: users.concat(this.state.orgUsers)
});
}
res.data.failed.forEach(item => {
const msg = `${item.email}: ${item.error_msg}`;
toaster.danger(msg);
});
}).catch((error) => {
let errMsg = Utils.getErrorMsg(error);
toaster.danger(errMsg);
});
};
addOrgUser = (email, name, password) => {
seafileAPI.orgAdminAddOrgUser(orgID, email, name, password).then(res => {
let userInfo = new OrgUserInfo(res.data);
this.state.orgUsers.unshift(userInfo);
this.setState({
orgUsers: this.state.orgUsers
});
this.toggleAddOrgUser();
let msg = gettext('successfully added user %s.');
msg = msg.replace('%s', email);
toaster.success(msg);
}).catch(error => {
let errMessage = Utils.getErrorMsg(error);
toaster.danger(errMessage);
this.toggleAddOrgUser();
});
};
toggleOrgUsersDelete = (email) => {
seafileAPI.orgAdminDeleteOrgUser(orgID, email).then(res => {
let users = this.state.orgUsers.filter(item => item.email != email);
this.setState({orgUsers: users});
let msg = gettext('Successfully deleted %s');
msg = msg.replace('%s', email);
toaster.success(msg);
}).catch(error => {
let errMessage = Utils.getErrorMsg(error);
toaster.danger(errMessage);
});
};
changeStatus= (email, isActive) => {
seafileAPI.orgAdminChangeOrgUserStatus(orgID, email, isActive).then(res => {
let users = this.state.orgUsers.map(item => {
if (item.email == email) {
item['is_active']= res.data['is_active'];
}
return item;
});
this.setState({orgUsers: users});
toaster.success(gettext('Edit succeeded.'));
}).catch(error => {
let errMessage = Utils.getErrorMsg(error);
toaster.danger(errMessage);
});
};
searchItems = (keyword) => {
navigate(`${siteRoot}org/useradmin/search-users/?query=${encodeURIComponent(keyword)}`);
};
getSearch = () => {
return ;
};
render() {
const topBtn = 'btn btn-secondary operation-item';
let topbarChildren;
topbarChildren = (
{invitationLink &&
}
{this.state.isImportOrgUsersDialogOpen &&
}
{this.state.isShowAddOrgUserDialog &&
}
{this.state.isInviteUserDialogOpen &&
}
);
return (
);
}
}
export default OrgUsers;