]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-9690 Improve positioning of secondary locations markers
authorStas Vilchik <stas.vilchik@sonarsource.com>
Tue, 10 Oct 2017 08:24:09 +0000 (10:24 +0200)
committerStas Vilchik <stas.vilchik@sonarsource.com>
Wed, 11 Oct 2017 10:02:21 +0000 (12:02 +0200)
server/sonar-web/src/main/js/components/SourceViewer/components/LineCode.js
server/sonar-web/src/main/js/components/common/LocationIndex.css
server/sonar-web/src/main/js/components/common/LocationIndex.js

index ad71197cf9cae1d2fabbdc3a41f78721ba19ec27..4cedfd753c46791839b37fb16e110e3340dc4674 100644 (file)
@@ -136,12 +136,16 @@ export default class LineCode extends React.PureComponent {
     }
   };
 
-  renderMarker(index /*: number */, message /*: ?string */) {
+  renderMarker(index /*: number */, message /*: ?string */, leading /*: boolean */ = false) {
     const { onLocationSelect } = this.props;
     const onClick = onLocationSelect ? () => onLocationSelect(index) : undefined;
     const ref = message != null ? node => (this.activeMarkerNode = node) : undefined;
     return (
-      <LocationIndex key={`marker-${index}`} onClick={onClick} selected={message != null}>
+      <LocationIndex
+        key={`marker-${index}`}
+        leading={leading}
+        onClick={onClick}
+        selected={message != null}>
         <span href="#" ref={ref}>
           {index + 1}
         </span>
@@ -193,6 +197,11 @@ export default class LineCode extends React.PureComponent {
     });
 
     const renderedTokens = [];
+
+    // track if the first marker is displayed before the source code
+    // set `false` for the first token in a row
+    let leadingMarker = false;
+
     tokens.forEach((token, index) => {
       if (token.markers.length > 0) {
         token.markers.forEach(marker => {
@@ -200,7 +209,7 @@ export default class LineCode extends React.PureComponent {
             highlightedLocationMessage != null && highlightedLocationMessage.index === marker
               ? highlightedLocationMessage.text
               : null;
-          renderedTokens.push(this.renderMarker(marker, message));
+          renderedTokens.push(this.renderMarker(marker, message, leadingMarker));
         });
       }
       renderedTokens.push(
@@ -208,6 +217,9 @@ export default class LineCode extends React.PureComponent {
           {token.text}
         </span>
       );
+
+      // keep leadingMarker truthy if previous token has only whitespaces
+      leadingMarker = (index === 0 ? true : leadingMarker) && !token.text.trim().length;
     });
 
     return (
index 73b5cd8986ec26c30fdbbe3417299426b05b8897..a1da0ffdefd7a56ae2017f9c26833debf9593d44 100644 (file)
   background-color: #ccc;
 }
 
+.location-index.is-leading {
+  position: absolute;
+  margin: 1px 0 0 -4px !important;
+  transform: translateX(-100%);
+}
+
 .location-index[tabindex] {
   cursor: pointer;
 }
index 2effb6e44ca508596d383ea4eb0081de58196259..43ddc0de0bfedb04aab16e5e2e0af90406d1f0aa 100644 (file)
@@ -25,18 +25,22 @@ import './LocationIndex.css';
 /*::
 type Props = {
   children?: React.Element<*>,
+  leading?: boolean,
   onClick?: () => void,
   selected?: boolean
 };
 */
 
 export default function LocationIndex(props /*: Props */) {
-  const { children, onClick, selected, ...other } = props;
+  const { children, leading, onClick, selected, ...other } = props;
   const clickAttributes = onClick ? { onClick, role: 'button', tabIndex: 0 } : {};
 
   // put {...others} because Tooltip sets some event handlers
   return (
-    <div className={classNames('location-index', { selected })} {...clickAttributes} {...other}>
+    <div
+      className={classNames('location-index', { 'is-leading': leading, selected })}
+      {...clickAttributes}
+      {...other}>
       {children}
     </div>
   );