]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-7481 Sparklines in the "History Table" widget are not displayed
authorStas Vilchik <vilchiks@gmail.com>
Tue, 29 Mar 2016 08:57:46 +0000 (10:57 +0200)
committerStas Vilchik <vilchiks@gmail.com>
Fri, 1 Apr 2016 11:27:29 +0000 (13:27 +0200)
server/sonar-server/src/main/resources/org/sonar/server/dashboard/widget/time_machine.html.erb
server/sonar-web/src/main/js/widgets/timeMachine/index.js [new file with mode: 0644]
server/sonar-web/src/main/js/widgets/widgets.js
server/sonar-web/src/main/webapp/WEB-INF/app/models/sonar/timemachine_row.rb

index 3271038a2f037e770b2bc8a7789cd4d1acdde68e..4fcb2f845d4d8ce727ea19f44c1487d0ae06b72d 100644 (file)
@@ -1,6 +1,6 @@
 <%
    rows_by_metric_id={}
-   
+
    # Retrieve widget settings
    metric_ids = []
    (1..10).each do |index|
@@ -33,7 +33,7 @@
                                     ]
    )
 
-   
+
    # Prepare the rows to display
    snapshot_by_id={}
    snapshots.each do |s|
@@ -44,7 +44,7 @@
 
      if measure.metric.timemachine? && (measure.value || measure.text_value)
        row=rows_by_metric_id[measure.metric_id]
-       
+
        #optimization : avoid eager loading of snapshots
        measure.snapshot=snapshot_by_id[measure.snapshot_id]
        row.add_measure(measure)
    end
 
    # Should display the sparkline?
-   sparkline_urls_by_row = {}
+   sparklines_by_row = {}
    if widget_properties["displaySparkLine"]
      rows.each do |row|
-       sparkline_url = row.sparkline_url
-       sparkline_urls_by_row[row] = sparkline_url if sparkline_url
+       sparkline = row.sparkline
+       sparklines_by_row[row] = sparkline if sparkline
      end
    end
-   display_sparkline = !sparkline_urls_by_row.empty?
+   display_sparkline = !sparklines_by_row.empty?
 %>
 
 <% if widget_properties["title"] %>
         <% end %>
         <%
            if display_sparkline
-             sparkline_url = sparkline_urls_by_row[row]
+             sparkline = sparklines_by_row[row]
         %>
           <td width="1%">
-            <%= image_tag(sparkline_url) if sparkline_url %>
+            <%
+              if sparkline
+                x = sparkline[0]
+                y = sparkline[1]
+            %>
+              <div class="time-machine-sparkline" data-x="<%= x.join(',') -%>" data-y="<%= y.join(',') -%>"></div>
+            <% end %>
           </td>
         <% end %>
       </tr>
   </table>
 
 </div>
+
+<script>
+  (function () {
+    var TimeMachineWidget = window.TimeMachineWidget;
+    TimeMachineWidget('.time-machine-sparkline');
+  })();
+</script>
diff --git a/server/sonar-web/src/main/js/widgets/timeMachine/index.js b/server/sonar-web/src/main/js/widgets/timeMachine/index.js
new file mode 100644 (file)
index 0000000..344857c
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+ * SonarQube
+ * Copyright (C) 2009-2016 SonarSource SA
+ * mailto:contact 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.
+ */
+import moment from 'moment';
+import React from 'react';
+import { render } from 'react-dom';
+import d3 from 'd3';
+
+import { LineChart } from '../../components/charts/line-chart';
+
+const DEFAULTS = {
+  width: 80,
+  height: 15,
+  dateFormat: 'YYYYMMDDHHmmss'
+};
+
+export default function (selector) {
+  const elements = Array.from(document.querySelectorAll(selector));
+
+  elements.forEach(element => {
+    const { dataset } = element;
+    const width = Number(dataset.width || DEFAULTS.width);
+    const height = Number(dataset.height || DEFAULTS.height);
+
+    const { x, y } = dataset;
+    const xData = x.split(',').map(v => moment(v, DEFAULTS.dateFormat).toDate());
+    const yData = y.split(',').map(v => Number(v));
+
+    const data = xData.map((x, index) => {
+      const y = yData[index];
+      return { x, y };
+    });
+
+    const domain = d3.extent(yData);
+
+    render((
+        <LineChart
+            data={data}
+            domain={domain}
+            width={width}
+            height={height}
+            padding={[1, 1, 1, 1]}
+            interpolate="linear"
+            displayBackdrop={false}
+            displayPoints={false}
+            displayVerticalGrid={false}/>
+    ), element);
+  });
+}
index d5bef69f777a033efcdfde0d78c2819229473815..157e7f718ec60e24d7d4cc412e9df57d313d3987 100644 (file)
@@ -32,6 +32,8 @@ import './old/widget';
 
 import IssueFilterWidget from './issue-filter/widget';
 import ComplexityDistribution from './complexity';
+import TimeMachine from './timeMachine';
 
 window.IssueFilterWidget = IssueFilterWidget;
 window.ComplexityDistribution = ComplexityDistribution;
+window.TimeMachineWidget = TimeMachine;
index 23d20b119d86c7b2b9ef1bf27be9458c3d35a4f3..2bc9e959f35a658327d820fa0d0a9ecd63385a2a 100644 (file)
@@ -41,17 +41,18 @@ class Sonar::TimemachineRow
     (self.domain <=> other.domain).nonzero? || (self.metric.short_name <=> other.metric.short_name)
   end
 
-  def sparkline_url
-    if metric.numeric? && @measure_by_sid.size>1
-      values=[]
+  def sparkline
+    if metric.numeric? && @measure_by_sid.size > 1
+      x = []
+      y = []
       @measure_by_sid.values.each do |measure|
         # date.to_f does not works under oracle
-        values << measure.snapshot.created_at.to_s(:number)
-        values << (measure.value.nil? ? 0 : measure.value)
+        x << measure.snapshot.created_at.to_s(:number)
+        y << (measure.value.nil? ? 0 : measure.value)
       end
-      "/chart?cht=sl&chdi=80x15&chv=" + values*',' + '&.png'
-     else
-       nil
-     end
+      [x, y]
+    else
+      nil
+    end
   end
 end