diff options
author | Stas Vilchik <stas-vilchik@users.noreply.github.com> | 2017-03-07 09:08:11 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-03-07 09:08:11 +0100 |
commit | b03c9e1d4d673a994da1a37b55b4d64c4df03d26 (patch) | |
tree | 84a3552ec29af449bc99bc48101579fc87be03dc /server/sonar-web/src/main/js/helpers | |
parent | f3c798e5ec60ba64594a906eaee45d52b7f46f76 (diff) | |
download | sonarqube-b03c9e1d4d673a994da1a37b55b4d64c4df03d26.tar.gz sonarqube-b03c9e1d4d673a994da1a37b55b4d64c4df03d26.zip |
MMF-703 More efficient UX for issue multiple locations (#1749)
Diffstat (limited to 'server/sonar-web/src/main/js/helpers')
-rw-r--r-- | server/sonar-web/src/main/js/helpers/issues.js | 7 | ||||
-rw-r--r-- | server/sonar-web/src/main/js/helpers/scrolling.js | 83 |
2 files changed, 90 insertions, 0 deletions
diff --git a/server/sonar-web/src/main/js/helpers/issues.js b/server/sonar-web/src/main/js/helpers/issues.js index 3a1e509f790..6410fe3e25c 100644 --- a/server/sonar-web/src/main/js/helpers/issues.js +++ b/server/sonar-web/src/main/js/helpers/issues.js @@ -41,6 +41,13 @@ type RawIssue = { author: string, comments?: Array<Comment>, component: string, + flows: Array<{ + locations: Array<{ + msg: string, + textRange: TextRange + }> + }>, + key: string, line?: number, project: string, rule: string, diff --git a/server/sonar-web/src/main/js/helpers/scrolling.js b/server/sonar-web/src/main/js/helpers/scrolling.js new file mode 100644 index 00000000000..e456eb3b340 --- /dev/null +++ b/server/sonar-web/src/main/js/helpers/scrolling.js @@ -0,0 +1,83 @@ +/* + * SonarQube + * Copyright (C) 2009-2017 SonarSource SA + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +// @flow +import debounce from 'lodash/debounce'; + +const SCROLLING_DURATION = 100; +const SCROLLING_INTERVAL = 10; +const SCROLLING_STEPS = SCROLLING_DURATION / SCROLLING_INTERVAL; + +const getScrollPosition = (element: HTMLElement): number => { + return element === window ? window.scrollY : element.scrollTop; +}; + +const scrollElement = (element: HTMLElement, position: number) => { + if (element === window) { + window.scrollTo(0, position); + } else { + element.scrollTop = position; + } +}; + +let smoothScrollTop = (y: number, parent) => { + const scrollTop = getScrollPosition(parent); + const scrollingDown = y > scrollTop; + const step = Math.ceil(Math.abs(y - scrollTop) / SCROLLING_STEPS); + let stepsDone = 0; + + const interval = setInterval(() => { + const scrollTop = getScrollPosition(parent); + if (scrollTop === y || SCROLLING_STEPS === stepsDone) { + clearInterval(interval); + } else { + let goal; + if (scrollingDown) { + goal = Math.min(y, scrollTop + step); + } else { + goal = Math.max(y, scrollTop - step); + } + stepsDone++; + scrollElement(parent, goal); + } + }, SCROLLING_INTERVAL); +}; + +smoothScrollTop = debounce(smoothScrollTop, SCROLLING_DURATION, { leading: true }); + +export const scrollToElement = ( + element: HTMLElement, + topOffset: number = 0, + bottomOffset: number = 0, + parent: HTMLElement = window +) => { + const { top, bottom } = element.getBoundingClientRect(); + const scrollTop = getScrollPosition(parent); + const height: number = parent === window ? window.innerHeight : parent.getBoundingClientRect().height; + + const parentTop = parent === window ? 0 : parent.getBoundingClientRect().top; + + if (top - parentTop < topOffset) { + smoothScrollTop(scrollTop - topOffset + top - parentTop, parent); + } + + if (bottom - parentTop > height - bottomOffset) { + smoothScrollTop(scrollTop + bottom - parentTop - height + bottomOffset, parent); + } +}; |