1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-09-26 07:22:34 +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:
llj
2025-06-18 18:21:51 +08:00
committed by GitHub
parent 0f20fc11b1
commit d73b668122
6 changed files with 101 additions and 116 deletions

View File

@@ -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>

View File

@@ -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,16 +172,16 @@ 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'>
<UserSelect <div className="position-relative">
placeholder={gettext('Search users')} <UserSelect
onSelectChange={this.onSelectChange} placeholder={gettext('Search users')}
selectedUsers={this.state.selectedUsers} onSelectChange={this.onSelectChange}
isMulti={true} selectedUsers={this.state.selectedUsers}
className="add-members-select" isMulti={true}
/> className="add-members-select"
{enableSelectMembersFromDept && />
<span onClick={this.onClickDeptBtn} className="sf3-font sf3-font-invite-visitors toggle-detail-btn"></span> <SelectUsersIcon onClick={this.props.toggleDepartmentDetailDialog} />
} </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>

View 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;

View File

@@ -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;

View 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;
}

View File

@@ -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;
}