1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-09-03 16:10:26 +00:00

[a11y] shared repos: improved 'more operations' dropdown & 'star/unstar'

This commit is contained in:
llj
2021-09-23 15:42:45 +08:00
parent 32502fabcd
commit 6e2a296ca1

View File

@@ -85,6 +85,12 @@ class SharedRepoListItem extends React.Component {
this.toggleOperationMenu(e); this.toggleOperationMenu(e);
} }
onDropdownToggleKeyDown = (e) => {
if (e.key == 'Enter' || e.key == 'Space') {
this.clickOperationMenuToggle(e);
}
}
toggleOperationMenu = (e) => { toggleOperationMenu = (e) => {
let dataset = e.target ? e.target.dataset : null; let dataset = e.target ? e.target.dataset : null;
if (dataset && dataset.toggle && dataset.toggle === 'Rename') { if (dataset && dataset.toggle && dataset.toggle === 'Rename') {
@@ -118,6 +124,12 @@ class SharedRepoListItem extends React.Component {
return { iconUrl, iconTitle, libPath }; return { iconUrl, iconTitle, libPath };
} }
onMenuItemKeyDown = (e) => {
if (e.key == 'Enter' || e.key == 'Space') {
this.onMenuItemClick(e);
}
}
onMenuItemClick = (e) => { onMenuItemClick = (e) => {
let operation = e.target.dataset.toggle; let operation = e.target.dataset.toggle;
switch(operation) { switch(operation) {
@@ -403,16 +415,18 @@ class SharedRepoListItem extends React.Component {
{deleteOperation} {deleteOperation}
<Dropdown isOpen={this.state.isItemMenuShow} toggle={this.toggleOperationMenu}> <Dropdown isOpen={this.state.isItemMenuShow} toggle={this.toggleOperationMenu}>
<DropdownToggle <DropdownToggle
tag="i" className="sf-dropdown-toggle sf2-icon-caret-down border-0 p-0"
className="sf-dropdown-toggle sf2-icon-caret-down"
title={gettext('More Operations')} title={gettext('More Operations')}
data-toggle="dropdown" data-toggle="dropdown"
aria-expanded={this.state.isItemMenuShow} aria-expanded={this.state.isItemMenuShow}
aria-haspopup={true}
style={{'minWidth': '0'}}
onClick={this.clickOperationMenuToggle} onClick={this.clickOperationMenuToggle}
onKeyDown={this.onDropdownToggleKeyDown}
/> />
<DropdownMenu> <DropdownMenu>
{operations.map((item, index) => { {operations.map((item, index) => {
return <DropdownItem key={index} data-toggle={item} onClick={this.onMenuItemClick}>{this.translateMenuItem(item)}</DropdownItem>; return <DropdownItem key={index} data-toggle={item} onClick={this.onMenuItemClick} onKeyDown={this.onMenuItemKeyDown}>{this.translateMenuItem(item)}</DropdownItem>;
})} })}
</DropdownMenu> </DropdownMenu>
</Dropdown> </Dropdown>
@@ -440,9 +454,13 @@ class SharedRepoListItem extends React.Component {
onToggleStarRepo = (e) => { onToggleStarRepo = (e) => {
e.preventDefault(); e.preventDefault();
const { repo_name: repoName } = this.props.repo;
if (this.state.isStarred) { if (this.state.isStarred) {
seafileAPI.unstarItem(this.props.repo.repo_id, '/').then(() => { seafileAPI.unstarItem(this.props.repo.repo_id, '/').then(() => {
this.setState({isStarred: !this.state.isStarred}); this.setState({isStarred: !this.state.isStarred});
const msg = gettext('Successfully unstarred {library_name_placeholder}.')
.replace('{library_name_placeholder}', repoName);
toaster.success(msg);
}).catch(error => { }).catch(error => {
let errMessage = Utils.getErrorMsg(error); let errMessage = Utils.getErrorMsg(error);
toaster.danger(errMessage); toaster.danger(errMessage);
@@ -450,6 +468,9 @@ class SharedRepoListItem extends React.Component {
} else { } else {
seafileAPI.starItem(this.props.repo.repo_id, '/').then(() => { seafileAPI.starItem(this.props.repo.repo_id, '/').then(() => {
this.setState({isStarred: !this.state.isStarred}); this.setState({isStarred: !this.state.isStarred});
const msg = gettext('Successfully starred {library_name_placeholder}.')
.replace('{library_name_placeholder}', repoName);
toaster.success(msg);
}).catch(error => { }).catch(error => {
let errMessage = Utils.getErrorMsg(error); let errMessage = Utils.getErrorMsg(error);
toaster.danger(errMessage); toaster.danger(errMessage);
@@ -471,7 +492,7 @@ class SharedRepoListItem extends React.Component {
<td><img src={iconUrl} title={iconTitle} alt={iconTitle} width="24" /></td> <td><img src={iconUrl} title={iconTitle} alt={iconTitle} width="24" /></td>
<td> <td>
{this.state.isRenaming ? {this.state.isRenaming ?
<Rename name={repo.repo_name} onRenameConfirm={this.onRenameConfirm} onRenameCancel={this.onRenameCancel}/> : <Rename name={repo.repo_name} onRenameConfirm={this.onRenameConfirm} onRenameCancel={this.onRenameCancel}/> :
<Link to={libPath}>{repo.repo_name}</Link> <Link to={libPath}>{repo.repo_name}</Link>
} }
</td> </td>