From cfab69910851579f365aefa3e4b048c54c92a0ff Mon Sep 17 00:00:00 2001 From: Pascal Mugnier Date: Fri, 4 May 2018 10:23:18 +0200 Subject: [PATCH] SONAR-10036 Autoscroll branch dropdown to selected item --- .../component/ComponentNavBranchesMenu.tsx | 30 +++++++++++++++++-- .../ComponentNavBranchesMenuItem.tsx | 3 +- .../ComponentNavBranchesMenu-test.tsx.snap | 8 +++++ 3 files changed, 37 insertions(+), 4 deletions(-) diff --git a/server/sonar-web/src/main/js/app/components/nav/component/ComponentNavBranchesMenu.tsx b/server/sonar-web/src/main/js/app/components/nav/component/ComponentNavBranchesMenu.tsx index 10f4b1ba885..5772988c123 100644 --- a/server/sonar-web/src/main/js/app/components/nav/component/ComponentNavBranchesMenu.tsx +++ b/server/sonar-web/src/main/js/app/components/nav/component/ComponentNavBranchesMenu.tsx @@ -31,6 +31,7 @@ import { isPullRequest, isBranch } from '../../../../helpers/branches'; +import { scrollToElement } from '../../../../helpers/scrolling'; import { translate } from '../../../../helpers/l10n'; import { getBranchLikeUrl } from '../../../../helpers/urls'; import SearchBox from '../../../../components/controls/SearchBox'; @@ -51,6 +52,8 @@ interface State { export default class ComponentNavBranchesMenu extends React.PureComponent { private node?: HTMLElement | null; + private listNode?: HTMLUListElement | null; + private selectedBranchNode?: HTMLLIElement | null; static contextTypes = { router: PropTypes.object @@ -63,12 +66,26 @@ export default class ComponentNavBranchesMenu extends React.PureComponent { const query = this.state.query.toLowerCase(); return sortBranchesAsTree(this.props.branchLikes).filter(branchLike => { @@ -190,7 +207,7 @@ export default class ComponentNavBranchesMenu extends React.PureComponent {showDivider &&
  • } @@ -218,15 +235,22 @@ export default class ComponentNavBranchesMenu extends React.PureComponent + (this.selectedBranchNode = isSelected ? node : this.selectedBranchNode) + } key={getBranchLikeKey(branchLike)} onSelect={this.handleSelect} - selected={isSameBranchLike(branchLike, selected)} + selected={isSelected} /> ); }); - return
      {items}
    ; + return ( +
      (this.listNode = node)}> + {items} +
    + ); }; render() { diff --git a/server/sonar-web/src/main/js/app/components/nav/component/ComponentNavBranchesMenuItem.tsx b/server/sonar-web/src/main/js/app/components/nav/component/ComponentNavBranchesMenuItem.tsx index 316ee5f06b1..8788fe657c1 100644 --- a/server/sonar-web/src/main/js/app/components/nav/component/ComponentNavBranchesMenuItem.tsx +++ b/server/sonar-web/src/main/js/app/components/nav/component/ComponentNavBranchesMenuItem.tsx @@ -39,6 +39,7 @@ export interface Props { component: Component; onSelect: (branchLike: BranchLike) => void; selected: boolean; + innerRef?: (node: HTMLLIElement) => void; } export default function ComponentNavBranchesMenuItem({ branchLike, ...props }: Props) { @@ -51,7 +52,7 @@ export default function ComponentNavBranchesMenuItem({ branchLike, ...props }: P (isShortLivingBranch(branchLike) && !branchLike.isOrphan) || isPullRequest(branchLike); return ( -
  • +