1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-09-02 15:38:15 +00:00

12.0 optimize user select (#6307)

* 01 remove useless reviewer

* 02 change user select style

* fix code format
This commit is contained in:
Michael An
2024-07-10 11:29:10 +08:00
committed by GitHub
parent a0ad4ee4e7
commit fbda14c855
19 changed files with 107 additions and 56 deletions

View File

@@ -44,6 +44,47 @@ const UserSelectStyle = {
clearIndicator: () => ({ clearIndicator: () => ({
display: 'none', display: 'none',
}), }),
// multi select style
multiValue: (provided) => {
return {
...provided,
display: 'inline-flex',
alignItems: 'center',
background: '#eaeaea',
borderRadius: '10px',
margin: '0 10px 0 0',
padding: '0 0 0 2px',
};
},
multiValueLabel: (provided) => {
return {
...provided,
padding: '0px',
};
},
multiValueRemove: (provided) => {
return {
...provided,
color: '#666',
':hover': {
backgroundColor: 'transparent',
color: '#555555',
}
};
},
// single select style
singleValue: (provided) => {
return {
...provided,
display: 'inline-flex',
alignItems: 'center',
background: '#eaeaea',
borderRadius: '10px',
margin: '0',
padding: '0 2px',
width: 'fit-content',
};
},
}; };
export { MenuSelectStyle, UserSelectStyle }; export { MenuSelectStyle, UserSelectStyle };

View File

@@ -279,7 +279,6 @@ class LibSubFolderSetUserPermissionDialog extends React.Component {
<UserSelect <UserSelect
ref="userSelect" ref="userSelect"
isMulti={true} isMulti={true}
className="reviewer-select"
placeholder={gettext('Search users')} placeholder={gettext('Search users')}
onSelectChange={this.handleUserSelectChange} onSelectChange={this.handleUserSelectChange}
value={this.state.selectedUsers} value={this.state.selectedUsers}

View File

@@ -55,7 +55,6 @@ class AddOrgAdminDialog extends React.Component {
<UserSelect <UserSelect
ref="userSelect" ref="userSelect"
isMulti={false} isMulti={false}
className="reviewer-select"
placeholder={gettext('Select a user as admin')} placeholder={gettext('Select a user as admin')}
onSelectChange={this.handleSelectChange} onSelectChange={this.handleSelectChange}
/> />

View File

@@ -55,11 +55,14 @@ class UserItem extends React.Component {
<tr onMouseEnter={this.onMouseEnter} onMouseLeave={this.onMouseLeave} tabIndex="0" onFocus={this.onMouseEnter}> <tr onMouseEnter={this.onMouseEnter} onMouseLeave={this.onMouseLeave} tabIndex="0" onFocus={this.onMouseEnter}>
<td className="name"> <td className="name">
<div className="position-relative"> <div className="position-relative">
<img src={item.user_info.avatar_url} <img
width="24" alt={item.user_info.nickname} src={item.user_info.avatar_url}
width="24"
alt={item.user_info.nickname}
className="rounded-circle mr-2 cursor-pointer" className="rounded-circle mr-2 cursor-pointer"
onMouseEnter={this.userAvatarOnMouseEnter} onMouseEnter={this.userAvatarOnMouseEnter}
onMouseLeave={this.userAvatarOnMouseLeave} /> onMouseLeave={this.userAvatarOnMouseLeave}
/>
<span>{item.user_info.nickname}</span> <span>{item.user_info.nickname}</span>
{isUserDetailsPopoverOpen && ( {isUserDetailsPopoverOpen && (
<div className="user-details-popover p-4 position-absolute w-100 mt-1"> <div className="user-details-popover p-4 position-absolute w-100 mt-1">
@@ -353,7 +356,6 @@ class ShareToUser extends React.Component {
<UserSelect <UserSelect
ref="userSelect" ref="userSelect"
isMulti={true} isMulti={true}
className="reviewer-select"
placeholder={gettext('Search users')} placeholder={gettext('Search users')}
onSelectChange={this.handleSelectChange} onSelectChange={this.handleSelectChange}
/> />

View File

@@ -41,7 +41,6 @@ class SysAdminBatchAddAdminDialog extends React.Component {
<ModalBody> <ModalBody>
<UserSelect <UserSelect
isMulti={true} isMulti={true}
className="reviewer-select"
placeholder={gettext('Search users')} placeholder={gettext('Search users')}
onSelectChange={this.handleSelectChange} onSelectChange={this.handleSelectChange}
/> />

View File

@@ -76,7 +76,6 @@ class SysAdminCreateGroupDialog extends React.Component {
</Label> </Label>
<UserSelect <UserSelect
isMulti={false} isMulti={false}
className="reviewer-select"
placeholder={gettext('Select a user')} placeholder={gettext('Select a user')}
onSelectChange={this.handleSelectChange} onSelectChange={this.handleSelectChange}
/> />

View File

@@ -77,7 +77,6 @@ class SysAdminCreateRepoDialog extends React.Component {
<UserSelect <UserSelect
id="userSelect" id="userSelect"
isMulti={false} isMulti={false}
className="reviewer-select"
placeholder={gettext('Select a user')} placeholder={gettext('Select a user')}
onSelectChange={this.handleSelectChange} onSelectChange={this.handleSelectChange}
/> />

View File

@@ -41,7 +41,6 @@ class SysAdminGroupAddMemberDialog extends React.Component {
<UserSelect <UserSelect
ref="userSelect" ref="userSelect"
isMulti={true} isMulti={true}
className="reviewer-select"
placeholder={gettext('Search users')} placeholder={gettext('Search users')}
onSelectChange={this.handleSelectChange} onSelectChange={this.handleSelectChange}
/> />

View File

@@ -47,7 +47,6 @@ class SysAdminTransferGroupDialog extends React.Component {
<UserSelect <UserSelect
ref="userSelect" ref="userSelect"
isMulti={false} isMulti={false}
className="reviewer-select"
placeholder={gettext('Select a user')} placeholder={gettext('Select a user')}
onSelectChange={this.handleSelectChange} onSelectChange={this.handleSelectChange}
/> />

View File

@@ -42,7 +42,6 @@ class SysAdminRepoTransferDialog extends React.Component {
<UserSelect <UserSelect
ref="userSelect" ref="userSelect"
isMulti={false} isMulti={false}
className="reviewer-select"
placeholder={gettext('Search users')} placeholder={gettext('Search users')}
onSelectChange={this.handleSelectChange} onSelectChange={this.handleSelectChange}
/> />

View File

@@ -236,7 +236,6 @@ class SysAdminShareToUser extends React.Component {
<UserSelect <UserSelect
ref="userSelect" ref="userSelect"
isMulti={true} isMulti={true}
className="reviewer-select"
placeholder={gettext('Search users')} placeholder={gettext('Search users')}
onSelectChange={this.handleSelectChange} onSelectChange={this.handleSelectChange}
/> />

View File

@@ -51,7 +51,6 @@ class TransferDialog extends React.Component {
submit = () => { submit = () => {
let user = this.state.selectedOption; let user = this.state.selectedOption;
this.props.submit(user); this.props.submit(user);
}; };
componentDidMount() { componentDidMount() {
@@ -83,7 +82,7 @@ class TransferDialog extends React.Component {
toaster.danger(errMessage); toaster.danger(errMessage);
}); });
} }
else{ else {
seafileAPI.listDepartments().then((res) => { seafileAPI.listDepartments().then((res) => {
for (let i = 0; i < res.data.length; i++) { for (let i = 0; i < res.data.length; i++) {
let obj = {}; let obj = {};
@@ -102,7 +101,6 @@ class TransferDialog extends React.Component {
onClick = () => { onClick = () => {
this.setState({ this.setState({
transferToUser: !this.state.transferToUser, transferToUser: !this.state.transferToUser,
}); });
}; };
@@ -142,7 +140,6 @@ class TransferDialog extends React.Component {
<UserSelect <UserSelect
ref="userSelect" ref="userSelect"
isMulti={false} isMulti={false}
className="reviewer-select"
placeholder={gettext('Select a user')} placeholder={gettext('Select a user')}
onSelectChange={this.handleSelectChange} onSelectChange={this.handleSelectChange}
/> />

View File

@@ -58,7 +58,6 @@ class TransferGroupDialog extends React.Component {
<UserSelect <UserSelect
ref="userSelect" ref="userSelect"
isMulti={false} isMulti={false}
className="reviewer-select"
placeholder={gettext('Please enter 1 or more character')} placeholder={gettext('Please enter 1 or more character')}
onSelectChange={this.handleSelectChange} onSelectChange={this.handleSelectChange}
/> />

View File

@@ -26,9 +26,14 @@ class UserSelect extends React.Component {
this.state = { this.state = {
searchValue: '' searchValue: ''
}; };
this.userSelect = React.createRef();
} }
onInputChange = (searchValue) => { onInputChange = (searchValue) => {
if (!this.props.isMulti && searchValue.trim()) {
this.handleSelectChange(null);
this.clearSelect();
}
this.setState({ searchValue }); this.setState({ searchValue });
}; };
@@ -49,20 +54,24 @@ class UserSelect extends React.Component {
let obj = {}; let obj = {};
obj.value = item.name; obj.value = item.name;
obj.email = item.email; obj.email = item.email;
obj.label = enableShowContactEmailWhenSearchUser ? ( if (enableShowContactEmailWhenSearchUser) {
<div className="d-flex"> obj.label = (
<img src={item.avatar_url} className="avatar" width="24" alt="" /> <div className="d-flex">
<div className="ml-2"> <img src={item.avatar_url} className="avatar" width="24" alt="" />
<span className="user-option-name">{item.name}</span><br /> <div className="ml-2">
<span className="user-option-email">{item.contact_email}</span> <span className="user-option-name">{item.name}</span><br />
<span className="user-option-email">{item.contact_email}</span>
</div>
</div> </div>
</div> );
) : ( } else {
<React.Fragment> obj.label = (
<img src={item.avatar_url} className="select-module select-module-icon avatar" alt=""/> <>
<span className='select-module select-module-name'>{item.name}</span> <img src={item.avatar_url} className="select-module select-module-icon avatar" alt=""/>
</React.Fragment> <span className='select-module select-module-name'>{item.name}</span>
); </>
);
}
this.options.push(obj); this.options.push(obj);
} }
callback(this.options); callback(this.options);
@@ -75,7 +84,7 @@ class UserSelect extends React.Component {
}; };
clearSelect = () => { clearSelect = () => {
this.refs.userSelect.onChange([], { action: 'clear' }); this.userSelect.current.onChange([], { action: 'clear' });
}; };
render() { render() {
@@ -92,14 +101,14 @@ class UserSelect extends React.Component {
); );
} }
}} }}
isMulti={this.props.isMulti} isMulti={true}
loadOptions={this.loadOptions} loadOptions={this.loadOptions}
onChange={this.handleSelectChange} onChange={this.handleSelectChange}
onInputChange={this.onInputChange} onInputChange={this.onInputChange}
placeholder={this.props.placeholder} placeholder={this.props.placeholder}
className={`user-select ${this.props.className}`} className={`user-select ${this.props.className}`}
value={this.props.value} value={this.props.value}
ref="userSelect" ref={this.userSelect}
styles={UserSelectStyle} styles={UserSelectStyle}
/> />
); );

View File

@@ -17,10 +17,6 @@
align-items: center; align-items: center;
} }
.header .common-list-btn, .header .add-reviewer-btn {
margin-right: .25em;
}
.header .common-list-btn .common-list-btn-number { .header .common-list-btn .common-list-btn-number {
margin-left: .5em; margin-left: .5em;
} }
@@ -124,7 +120,6 @@
border: 0; border: 0;
} }
.review-side-panel-item .reviewer-info,
.review-side-panel-item .author-info { .review-side-panel-item .author-info {
display: flex; display: flex;
align-items: center; align-items: center;
@@ -156,7 +151,6 @@
width: 1.5rem; width: 1.5rem;
} }
.review-side-panel-item .reviewer-name,
.review-side-panel-item .author-name { .review-side-panel-item .author-name {
height: 2rem; height: 2rem;
line-height: 2rem; line-height: 2rem;

View File

@@ -1,10 +0,0 @@
.reviewer-list .reviewer-avatar:first-child {
margin-left: 0;
}
.reviewer-list .reviewer-avatar {
margin-left: -0.5rem;
box-shadow: 0 0 0 2px #fff;
cursor: pointer;
}

View File

@@ -2,8 +2,3 @@
line-height: 2rem; line-height: 2rem;
margin-left: 10px; margin-left: 10px;
} }
.group-transfer-select .true__dropdown-indicator,
.reviewer-select .true__indicator-separator {
display: none;
}

View File

@@ -2,6 +2,39 @@
font-size: 14px; font-size: 14px;
font-weight: 500; font-weight: 500;
} }
.user-option-email { .user-option-email {
font-size: 12px; font-size: 12px;
} }
/* dropdown menu avatar is 24*24px, selection box avatar is 16*16px */
.user-select .true__value-container .select-module.select-module-icon.avatar {
height: 16px;
width: 16px;
}
.user-select .true__value-container .true__multi-value__label {
padding: 0px;
}
.user-select .true__value-container .true__multi-value__label .select-module.select-module-icon.avatar {
transform: translateY(-2px);
}
.user-select .true__value-container .select-module.select-module-name {
font-size: 13px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
flex: 1 1;
line-height: 20px;
margin-left: 5px;
}
.user-select .true__control.true__control--is-focused,
.user-select .true__control.true__control--is-focused:hover {
background-color: #ffffff;
border-color: #1991eb;
outline: 0;
box-shadow: 0 0 0 2px rgba(70, 127, 207, 0.25);
}

View File

@@ -328,7 +328,7 @@ class OrgAllRepos extends Component {
'current_page': page, 'current_page': page,
'has_next_page': has_next_page 'has_next_page': has_next_page
}; };
}else{ } else {
page_info = res.data.page_info; page_info = res.data.page_info;
} }
this.setState({ this.setState({