mirror of
https://github.com/haiwen/seahub.git
synced 2025-09-26 15:26:19 +00:00
['share' dialog, group 'manage members' dialog] fixup for the 'select (#7949)
users' icon & the input before it; improved the code - highlight the 'select user' icon in the 'share' dialog when hover on it - fixed the content width of the 'search users' inputs in the 'share' dialog & the group 'manage members' dialog - improved code: added a common component for the 'select user' icon
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import classnames from 'classnames';
|
import classnames from 'classnames';
|
||||||
import { gettext, isPro, cloudMode, isOrgContext } from '../../utils/constants';
|
import { gettext, isPro } from '../../utils/constants';
|
||||||
import { Button } from 'reactstrap';
|
import { Button } from 'reactstrap';
|
||||||
import { seafileAPI } from '../../utils/seafile-api';
|
import { seafileAPI } from '../../utils/seafile-api';
|
||||||
import { Utils, isMobile } from '../../utils/utils';
|
import { Utils, isMobile } from '../../utils/utils';
|
||||||
@@ -11,6 +11,7 @@ import SharePermissionEditor from '../select-editor/share-permission-editor';
|
|||||||
import DepartmentDetailDialog from './department-detail-dialog';
|
import DepartmentDetailDialog from './department-detail-dialog';
|
||||||
import EmptyTip from '../../components/empty-tip';
|
import EmptyTip from '../../components/empty-tip';
|
||||||
import Loading from '../../components/loading';
|
import Loading from '../../components/loading';
|
||||||
|
import SelectUsersIcon from '../select-members-to-share-with';
|
||||||
|
|
||||||
import '../../css/invitations.css';
|
import '../../css/invitations.css';
|
||||||
import '../../css/share-to-user.css';
|
import '../../css/share-to-user.css';
|
||||||
@@ -247,7 +248,6 @@ class ShareToUser extends React.Component {
|
|||||||
sharedItems: [],
|
sharedItems: [],
|
||||||
isWiki: this.props.repoType === 'wiki',
|
isWiki: this.props.repoType === 'wiki',
|
||||||
tmpUserList: [],
|
tmpUserList: [],
|
||||||
enableSelectMembersFromDept: false,
|
|
||||||
isShowDepartmentDetailDialog: false,
|
isShowDepartmentDetailDialog: false,
|
||||||
isLoading: true
|
isLoading: true
|
||||||
};
|
};
|
||||||
@@ -278,7 +278,6 @@ class ShareToUser extends React.Component {
|
|||||||
componentDidMount() {
|
componentDidMount() {
|
||||||
let path = this.props.itemPath;
|
let path = this.props.itemPath;
|
||||||
let repoID = this.props.repoID;
|
let repoID = this.props.repoID;
|
||||||
this.getPermForSelectMembersFromDept();
|
|
||||||
seafileAPI.listSharedItems(repoID, path, 'user').then((res) => {
|
seafileAPI.listSharedItems(repoID, path, 'user').then((res) => {
|
||||||
if (res.data.length !== 0) {
|
if (res.data.length !== 0) {
|
||||||
let tmpUserList = res.data.map(item => {
|
let tmpUserList = res.data.map(item => {
|
||||||
@@ -510,34 +509,8 @@ class ShareToUser extends React.Component {
|
|||||||
this.toggleDepartmentDetailDialog();
|
this.toggleDepartmentDetailDialog();
|
||||||
};
|
};
|
||||||
|
|
||||||
getPermForSelectMembersFromDept = () => {
|
|
||||||
if (window.app.config.lang !== 'zh-cn') {
|
|
||||||
this.setState({
|
|
||||||
enableSelectMembersFromDept: false
|
|
||||||
});
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cloudMode && !isOrgContext) {
|
|
||||||
this.setState({
|
|
||||||
enableSelectMembersFromDept: false
|
|
||||||
});
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
seafileAPI.listAddressBookDepartments().then((res) => {
|
|
||||||
this.setState({
|
|
||||||
enableSelectMembersFromDept: res.data.departments.length > 0
|
|
||||||
});
|
|
||||||
}).catch(error => {
|
|
||||||
this.setState({
|
|
||||||
enableSelectMembersFromDept: false
|
|
||||||
});
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const { sharedItems, enableSelectMembersFromDept } = this.state;
|
const { sharedItems } = this.state;
|
||||||
let thead = (
|
let thead = (
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
@@ -568,17 +541,12 @@ class ShareToUser extends React.Component {
|
|||||||
<div className='add-members'>
|
<div className='add-members'>
|
||||||
<UserSelect
|
<UserSelect
|
||||||
isMulti={true}
|
isMulti={true}
|
||||||
className={classnames('share-to-user-select', { 'user-select-right-btn': enableSelectMembersFromDept })}
|
className="share-to-user-select"
|
||||||
placeholder={gettext('Search users...')}
|
placeholder={gettext('Search users...')}
|
||||||
onSelectChange={this.handleSelectChange}
|
onSelectChange={this.handleSelectChange}
|
||||||
selectedUsers={this.state.selectedUsers}
|
selectedUsers={this.state.selectedUsers}
|
||||||
/>
|
/>
|
||||||
{enableSelectMembersFromDept &&
|
<SelectUsersIcon onClick={this.toggleDepartmentDetailDialog} />
|
||||||
<span
|
|
||||||
onClick={this.toggleDepartmentDetailDialog}
|
|
||||||
className="sf3-font sf3-font-invite-visitors toggle-detail-btn">
|
|
||||||
</span>
|
|
||||||
}
|
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
|
@@ -2,12 +2,13 @@ import React, { Fragment } from 'react';
|
|||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import { Button, InputGroup, InputGroupText, Input } from 'reactstrap';
|
import { Button, InputGroup, InputGroupText, Input } from 'reactstrap';
|
||||||
import { Utils } from '../utils/utils';
|
import { Utils } from '../utils/utils';
|
||||||
import { gettext, cloudMode, isOrgContext } from '../utils/constants';
|
import { gettext } from '../utils/constants';
|
||||||
import { seafileAPI } from '../utils/seafile-api';
|
import { seafileAPI } from '../utils/seafile-api';
|
||||||
import UserSelect from './user-select';
|
import UserSelect from './user-select';
|
||||||
import toaster from './toast';
|
import toaster from './toast';
|
||||||
import Loading from './loading';
|
import Loading from './loading';
|
||||||
import GroupMembers from './group-members';
|
import GroupMembers from './group-members';
|
||||||
|
import SelectUsersIcon from './select-members-to-share-with';
|
||||||
|
|
||||||
const propTypes = {
|
const propTypes = {
|
||||||
toggleManageMembersDialog: PropTypes.func,
|
toggleManageMembersDialog: PropTypes.func,
|
||||||
@@ -21,7 +22,6 @@ class ManageMembersDialog extends React.Component {
|
|||||||
constructor(props) {
|
constructor(props) {
|
||||||
super(props);
|
super(props);
|
||||||
this.state = {
|
this.state = {
|
||||||
enableSelectMembersFromDept: false,
|
|
||||||
isLoading: true, // first loading
|
isLoading: true, // first loading
|
||||||
isLoadingMore: false,
|
isLoadingMore: false,
|
||||||
groupMembers: [],
|
groupMembers: [],
|
||||||
@@ -38,7 +38,6 @@ class ManageMembersDialog extends React.Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
componentDidMount() {
|
componentDidMount() {
|
||||||
this.getPermForSelectMembersFromDept();
|
|
||||||
this.listGroupMembers(this.state.page);
|
this.listGroupMembers(this.state.page);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -162,40 +161,8 @@ class ManageMembersDialog extends React.Component {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
onClickDeptBtn = () => {
|
|
||||||
this.props.toggleDepartmentDetailDialog();
|
|
||||||
};
|
|
||||||
|
|
||||||
getPermForSelectMembersFromDept = () => {
|
|
||||||
if (window.app.config.lang !== 'zh-cn') {
|
|
||||||
this.setState({
|
|
||||||
enableSelectMembersFromDept: false
|
|
||||||
});
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cloudMode && !isOrgContext) {
|
|
||||||
this.setState({
|
|
||||||
enableSelectMembersFromDept: false
|
|
||||||
});
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
seafileAPI.listAddressBookDepartments().then((res) => {
|
|
||||||
this.setState({
|
|
||||||
enableSelectMembersFromDept: res.data.departments.length > 0
|
|
||||||
});
|
|
||||||
}).catch(error => {
|
|
||||||
this.setState({
|
|
||||||
enableSelectMembersFromDept: false
|
|
||||||
});
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const {
|
const {
|
||||||
enableSelectMembersFromDept,
|
|
||||||
isLoading, hasNextPage, groupMembers,
|
isLoading, hasNextPage, groupMembers,
|
||||||
keyword, membersFound,
|
keyword, membersFound,
|
||||||
searchActive
|
searchActive
|
||||||
@@ -205,6 +172,7 @@ class ManageMembersDialog extends React.Component {
|
|||||||
<Fragment>
|
<Fragment>
|
||||||
<p className="mb-2">{gettext('Add group member')}</p>
|
<p className="mb-2">{gettext('Add group member')}</p>
|
||||||
<div className='add-members'>
|
<div className='add-members'>
|
||||||
|
<div className="position-relative">
|
||||||
<UserSelect
|
<UserSelect
|
||||||
placeholder={gettext('Search users')}
|
placeholder={gettext('Search users')}
|
||||||
onSelectChange={this.onSelectChange}
|
onSelectChange={this.onSelectChange}
|
||||||
@@ -212,9 +180,8 @@ class ManageMembersDialog extends React.Component {
|
|||||||
isMulti={true}
|
isMulti={true}
|
||||||
className="add-members-select"
|
className="add-members-select"
|
||||||
/>
|
/>
|
||||||
{enableSelectMembersFromDept &&
|
<SelectUsersIcon onClick={this.props.toggleDepartmentDetailDialog} />
|
||||||
<span onClick={this.onClickDeptBtn} className="sf3-font sf3-font-invite-visitors toggle-detail-btn"></span>
|
</div>
|
||||||
}
|
|
||||||
{this.state.selectedUsers.length > 0 ?
|
{this.state.selectedUsers.length > 0 ?
|
||||||
<Button color="primary" onClick={this.addGroupMember}>{gettext('Submit')}</Button> :
|
<Button color="primary" onClick={this.addGroupMember}>{gettext('Submit')}</Button> :
|
||||||
<Button color="primary" disabled>{gettext('Submit')}</Button>
|
<Button color="primary" disabled>{gettext('Submit')}</Button>
|
||||||
|
65
frontend/src/components/select-members-to-share-with.js
Normal file
65
frontend/src/components/select-members-to-share-with.js
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
import React, { Fragment } from 'react';
|
||||||
|
import PropTypes from 'prop-types';
|
||||||
|
import { cloudMode, isOrgContext } from '../utils/constants';
|
||||||
|
import { seafileAPI } from '../utils/seafile-api';
|
||||||
|
|
||||||
|
import '../css/select-users-icon.css';
|
||||||
|
|
||||||
|
const propTypes = {
|
||||||
|
onClick: PropTypes.func
|
||||||
|
};
|
||||||
|
|
||||||
|
class SelectUsersIcon extends React.Component {
|
||||||
|
|
||||||
|
constructor(props) {
|
||||||
|
super(props);
|
||||||
|
this.state = {
|
||||||
|
enableSelectMembersFromDept: false
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
componentDidMount() {
|
||||||
|
this.getPermForSelectMembersFromDept();
|
||||||
|
}
|
||||||
|
|
||||||
|
getPermForSelectMembersFromDept = () => {
|
||||||
|
if (window.app.config.lang !== 'zh-cn') {
|
||||||
|
this.setState({
|
||||||
|
enableSelectMembersFromDept: false
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cloudMode && !isOrgContext) {
|
||||||
|
this.setState({
|
||||||
|
enableSelectMembersFromDept: false
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
seafileAPI.listAddressBookDepartments().then((res) => {
|
||||||
|
this.setState({
|
||||||
|
enableSelectMembersFromDept: res.data.departments.length > 0
|
||||||
|
});
|
||||||
|
}).catch(error => {
|
||||||
|
this.setState({
|
||||||
|
enableSelectMembersFromDept: false
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
render() {
|
||||||
|
const { enableSelectMembersFromDept } = this.state;
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
{enableSelectMembersFromDept &&
|
||||||
|
<i role="button" onClick={this.props.onClick} className="sf3-font sf3-font-invite-visitors toggle-detail-btn"></i>
|
||||||
|
}
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SelectUsersIcon.propTypes = propTypes;
|
||||||
|
|
||||||
|
export default SelectUsersIcon;
|
@@ -33,21 +33,6 @@
|
|||||||
margin-top: 10px;
|
margin-top: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.group-manage-members-dialog .add-members .toggle-detail-btn {
|
|
||||||
position: absolute;
|
|
||||||
top: 6px;
|
|
||||||
right: 90px;
|
|
||||||
border-left: 1px solid #ccc;
|
|
||||||
padding-left: 9px;
|
|
||||||
font-size: 18px;
|
|
||||||
cursor: pointer;
|
|
||||||
color: #999;
|
|
||||||
}
|
|
||||||
|
|
||||||
.group-manage-members-dialog .add-members .toggle-detail-btn:hover {
|
|
||||||
color: #666;
|
|
||||||
}
|
|
||||||
|
|
||||||
.group-manage-members-dialog .search-group-members {
|
.group-manage-members-dialog .search-group-members {
|
||||||
color: #666;
|
color: #666;
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
|
19
frontend/src/css/select-users-icon.css
Normal file
19
frontend/src/css/select-users-icon.css
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
.add-members .toggle-detail-btn {
|
||||||
|
position: absolute;
|
||||||
|
top: 6px;
|
||||||
|
right: 12px;
|
||||||
|
border-left: 1px solid #ccc;
|
||||||
|
padding-left: 9px;
|
||||||
|
font-size: 18px;
|
||||||
|
cursor: pointer;
|
||||||
|
color: #999;
|
||||||
|
}
|
||||||
|
|
||||||
|
.add-members .toggle-detail-btn:hover {
|
||||||
|
color: #666;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* for the input before .toggle-detail-btn */
|
||||||
|
.selected-user-item-container:has(+ .toggle-detail-btn) {
|
||||||
|
padding-right: 40px;
|
||||||
|
}
|
@@ -28,22 +28,3 @@
|
|||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
position: relative;
|
position: relative;
|
||||||
}
|
}
|
||||||
|
|
||||||
.share-link-container .add-members .share-to-user-select {
|
|
||||||
max-width: calc(100% - 10px);
|
|
||||||
}
|
|
||||||
|
|
||||||
.share-link-container .add-members .toggle-detail-btn {
|
|
||||||
position: absolute;
|
|
||||||
top: 6px;
|
|
||||||
right: 20px;
|
|
||||||
border-left: 1px solid #ccc;
|
|
||||||
padding-left: 9px;
|
|
||||||
font-size: 18px;
|
|
||||||
color: #999;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
.user-select.user-select-right-btn .true__value-container {
|
|
||||||
padding-right: 40px;
|
|
||||||
}
|
|
||||||
|
Reference in New Issue
Block a user