From dfa2d0bcbc4a7d42198260a7b1c90ff63d9934d2 Mon Sep 17 00:00:00 2001
From: BeezyT <timo@ezdesign.de>
Date: Mon, 26 Mar 2012 14:55:27 +0000
Subject: [PATCH] refs #534 first working version of row evolution!

 * include trigger in datatable_cell
 * new methods in API_API: getUnit and isLowerValueBetter
 * lower bounce / exit rate is green in the popover
 * minor fixes

git-svn-id: http://dev.piwik.org/svn/trunk@6120 59fd770c-687e-43c8-a1e3-f5a4ff64c105
---
 core/ViewDataTable/GenerateGraphData.php      |  21 ++-------
 lang/en.php                                   |   3 +-
 plugins/API/API.php                           |  42 ++++++++++++++++++
 .../DataTableRowAction/RowEvolution.php       |  20 +++++----
 plugins/CoreHome/templates/datatable.js       |   2 +-
 plugins/CoreHome/templates/datatable_cell.tpl |   8 ++++
 plugins/CoreHome/templates/jqplot.css         |   4 +-
 .../MultiSites/images/arrow_down_green.png    | Bin 0 -> 1532 bytes
 plugins/MultiSites/images/arrow_up_red.png    | Bin 0 -> 1528 bytes
 9 files changed, 71 insertions(+), 29 deletions(-)
 create mode 100644 plugins/MultiSites/images/arrow_down_green.png
 create mode 100644 plugins/MultiSites/images/arrow_up_red.png

diff --git a/core/ViewDataTable/GenerateGraphData.php b/core/ViewDataTable/GenerateGraphData.php
index 094225869c..55400aa3f7 100644
--- a/core/ViewDataTable/GenerateGraphData.php
+++ b/core/ViewDataTable/GenerateGraphData.php
@@ -137,7 +137,7 @@ abstract class Piwik_ViewDataTable_GenerateGraphData extends Piwik_ViewDataTable
 	{
 		// derive units from column names
 		$idSite = Piwik_Common::getRequestVar('idSite', null, 'int');
-		$units = $this->guessUnitFromRequestedColumnNames($this->getColumnsToDisplay(), $idSite);
+		$units = $this->deriveUnitsFromRequestedColumnNames($this->getColumnsToDisplay(), $idSite);
 		if(!empty($this->yAxisUnit))
 		{
 			// force unit to the value set via $this->setAxisYUnit()
@@ -150,26 +150,13 @@ abstract class Piwik_ViewDataTable_GenerateGraphData extends Piwik_ViewDataTable
 		return $units;
 	}
 	
-	protected function guessUnitFromRequestedColumnNames($requestedColumnNames, $idSite)
+	protected function deriveUnitsFromRequestedColumnNames($requestedColumnNames, $idSite)
 	{
-		$nameToUnit = array(
-			'_rate' => '%',
-			'revenue' => Piwik::getCurrency($idSite),
-			'_time_' => 's'
-		);
-		
 		$units = array();
 		foreach($requestedColumnNames as $columnName)
 		{
-			$units[$columnName] = false;
-			foreach($nameToUnit as $pattern => $type)
-			{
-				if(strpos($columnName, $pattern) !== false)
-				{
-					$units[$columnName] = $type;
-					break;
-				}
-			}
+			$derivedUnit = Piwik_API_API::getUnit($columnName, $idSite);
+			$units[$columnName] = empty($derivedUnit) ? false : $derivedUnit;
 		}
 		return $units;
 	}
diff --git a/lang/en.php b/lang/en.php
index aa1111304a..60a4ca59dd 100644
--- a/lang/en.php
+++ b/lang/en.php
@@ -1528,7 +1528,8 @@ Note: this token will expire in 24 hrs.',
 	'PDFReports_ReportIncludeNWebsites' => 'The report will include main metrics for all websites that have at least one visit (from the %s websites currently available).',
 	'ImageGraph_PluginDescription' => 'Generate beautiful static PNG Graph images for any Piwik report.',
 	'ImageGraph_ColumnOrdinateMissing' => 'The column \'%s\' was not found in this report.',
-	'RowEvolution_AvailableMetrics' => 'Metrics for',
+	'RowEvolution_MetricsFor' => 'Metrics for %s',
+	'RowEvolution_AvailableMetrics' => 'Available metrics',
 	'RowEvolution_MetricDetailsText' => 'between %s and %s, %s over the period',
 	'RowEvolution_Documentation' => 'Click the metrics to display them in the large evolution graph. Use shift-click to display multiple metrics at once.',
 	'RowEvolution_CompareRows' => 'Compare records',
diff --git a/plugins/API/API.php b/plugins/API/API.php
index fd635a9768..10bac75905 100644
--- a/plugins/API/API.php
+++ b/plugins/API/API.php
@@ -91,6 +91,48 @@ class Piwik_API_API
 		return self::$instance;
 	}
 	
+	/**
+	 * Derive the unit name from a column name
+	 */
+	static public function getUnit($columnName, $idSite)
+	{
+		$nameToUnit = array(
+			'_rate' => '%',
+			'revenue' => Piwik::getCurrency($idSite),
+			'_time_' => 's'
+		);
+		
+		foreach ($nameToUnit as $pattern => $type)
+		{
+			if (strpos($columnName, $pattern) !== false)
+			{
+				return $type;
+			}
+		}
+		
+		return '';
+	}
+	
+	/**
+	 * Is a lower value for a given column better?
+	 */
+	static public function isLowerValueBetter($columnName)
+	{
+		$lowerIsBetterPatterns = array(
+			'bounce', 'exit'
+		);
+		
+		foreach ($lowerIsBetterPatterns as $pattern)
+		{
+			if (strpos($columnName, $pattern) !== false)
+			{
+				return true;
+			}
+		}
+		
+		return false;
+	}
+	
 	/**
 	 * Default translations for many core metrics.
 	 * This is used for exports with translated labels. The exports contain columns that
diff --git a/plugins/CoreHome/DataTableRowAction/RowEvolution.php b/plugins/CoreHome/DataTableRowAction/RowEvolution.php
index 1854c8fe21..e2a60cbb11 100644
--- a/plugins/CoreHome/DataTableRowAction/RowEvolution.php
+++ b/plugins/CoreHome/DataTableRowAction/RowEvolution.php
@@ -120,7 +120,7 @@ class Piwik_CoreHome_DataTableRowAction_RowEvolution
 		{
 			$icon = $this->rowIcon ? '<img src="'.$this->rowIcon.'" alt="">' : '';
 			$rowLabel = str_replace('/', '<wbr>/', str_replace('&', '<wbr>&', $this->rowLabel));
-			$metricsText .= ' '.$this->dimension.': '.$icon.' '.$rowLabel;
+			$metricsText = sprintf(Piwik_Translate('RowEvolution_MetricsFor'), $this->dimension.': '.$icon.' '.$rowLabel);
 			$popoverTitle = $icon.' '.$rowLabel;
 		}
 		
@@ -219,25 +219,25 @@ class Piwik_CoreHome_DataTableRowAction_RowEvolution
 			$min = $metricData['min'];
 			$change = $metricData['change'];
 			
-			if ($max == 0 && !($this instanceof Piwik_CoreHome_DataTableAction_MultiRowEvolution))
+			if ($max == 0 && !($this instanceof Piwik_CoreHome_DataTableRowAction_MultiRowEvolution))
 			{
-				// series with only 0 cause trouble in js
 				continue;
 			}
 			
+			$lowerIsBetter = Piwik_API_API::isLowerValueBetter($metric);
 			if (substr($change, 0, 1) == '+')
 			{
-				$changeClass = 'up';
-				$changeImage = 'arrow_up';
+				$changeClass = $lowerIsBetter ? 'bad' : 'good';
+				$changeImage = $lowerIsBetter ? 'arrow_up_red' : 'arrow_up';
 			}
 			else if (substr($change, 0, 1) == '-')
 			{
-				$changeClass = 'down';
-				$changeImage = 'arrow_down';
+				$changeClass = $lowerIsBetter ? 'good' : 'bad';
+				$changeImage = $lowerIsBetter ? 'arrow_down_green' : 'arrow_down';
 			}
 			else
 			{
-				$changeClass = 'nochange';
+				$changeClass = 'neutral';
 				$changeImage = false;
 			}
 			
@@ -245,6 +245,10 @@ class Piwik_CoreHome_DataTableRowAction_RowEvolution
 					.($changeImage ? '<img src="plugins/MultiSites/images/'.$changeImage.'.png" /> ' : '')
 					.$change.'</span>';
 			
+			$unit = Piwik_API_API::getUnit($metric, $this->idSite);
+			$min .= $unit;
+			$max .= $unit;
+			
 			$details = Piwik_Translate('RowEvolution_MetricDetailsText', array($min, $max, $change));
 			
 			$color = $colors[ $i % count($colors) ];
diff --git a/plugins/CoreHome/templates/datatable.js b/plugins/CoreHome/templates/datatable.js
index c4545e7e7f..078185c4aa 100644
--- a/plugins/CoreHome/templates/datatable.js
+++ b/plugins/CoreHome/templates/datatable.js
@@ -1053,7 +1053,7 @@ dataTable.prototype =
 					{
 						$(this).blur();
 						actions.hide();
-						action.onActionClick(tr, e);
+						action.trigger(tr, e);
 						return false;
 					});
 				}
diff --git a/plugins/CoreHome/templates/datatable_cell.tpl b/plugins/CoreHome/templates/datatable_cell.tpl
index 53fcc68a91..453f03d1eb 100644
--- a/plugins/CoreHome/templates/datatable_cell.tpl
+++ b/plugins/CoreHome/templates/datatable_cell.tpl
@@ -1,3 +1,11 @@
+{if $column=='label'}
+	<div class="dataTableRowActions">
+		{if !isset($properties.disable_row_evolution) || $properties.disable_row_evolution === false}
+			<a href="#" class="actionRowEvolution"><img src="themes/default/images/row_evolution.png" alt="" /></a>
+		{/if}
+	</div>
+{/if}
+
 {if !$row.idsubdatatable && $column=='label' && !empty($row.metadata.url)}
 <a target="_blank" href='{if !in_array(substr($row.metadata.url,0,4), array('http','ftp:'))}http://{/if}{$row.metadata.url|escape:'html'}'>
 	{if empty($row.metadata.logo)}
diff --git a/plugins/CoreHome/templates/jqplot.css b/plugins/CoreHome/templates/jqplot.css
index 5942991248..81a8612558 100644
--- a/plugins/CoreHome/templates/jqplot.css
+++ b/plugins/CoreHome/templates/jqplot.css
@@ -182,11 +182,11 @@
 	padding-left: 15px;
 }
 
-.rowevolution table.metrics td.text span.up {
+.rowevolution table.metrics td.text span.good {
 	color: green;
 }
 
-.rowevolution table.metrics td.text span.down {
+.rowevolution table.metrics td.text span.bad {
 	color: red;
 }
 
diff --git a/plugins/MultiSites/images/arrow_down_green.png b/plugins/MultiSites/images/arrow_down_green.png
new file mode 100644
index 0000000000000000000000000000000000000000..a8d0f695d0df0d6908ddcfd2909d11353618b7f9
GIT binary patch
literal 1532
zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9Sn@VE&Nl>>S|f?5q$_l%JNFlghxL
zF|jxFZvO2M5&O>km?dKN3pV!giFU6K4UXO^Ew%O-o9E=EFP)@zp1q;9<YZ}{RPc4P
zZI^RH=YM0$=lQ|hu!&u6LWPqQ&yjDN-ZF0S40aT~s<Onk<d#Fm<Zn%@3f8R;-W_{v
z$HevZme0%W-d{9zI37Oh@eEJNgnOT2P3KSSpFd-ob(kXOc}Mjx4$GHS`|XO+W70d;
z>VEBTyyC%o=Ipm#|1T~LTe+NBWu8+`xNWW6$ION)E3Mb@E8KJY`9br(<DHK-k7V`K
zIwBG)rajg<Y%C+sZxQ@TBWYUqlIvTw9;qJrYi#&4hv&0Q(^h4F-B(h(&Qt}Ky`7bK
zDPos@!2k26`DRfct3JN`^h~Y)(eD1MaplLa2-L63-syQnUwPlNAChYIq96Aji&5>Z
z(0BMWb5`||LqAWNi@gqhuW+w(N7j$ll>z%Q&Q4L=ky})G&TduPoa|lZUAE2Qg7;Tl
zcAEHH*<os0@tXLK>esy+FYGsXr|a`9s!r_nV%2x<1@|u>JKa$&Q2*lAE0*(-5zErz
zp8jjq?u+Lu7PzLnIpm35r_0_2#~j{WUw&+duH}Qribc^zvBrHOPX8t)vu*C!Iq`Fz
z^V*g<(z9ltF1CMSw^eK5`77&IO-tP?>rx}pr)shw;V{oTtB4JZMk^+?^X!u?2n=Rs
z_L&lJC1{F7=ki3p)VGyS8x9v9nZdi}`b<-|%<~Tg-?hlhE)i~hbNso2<|OBo89fa?
z_f+yH9#-kTBv@2%d7Di4`J}ryzkIecxuE@6w)xD?d2aC{@7Gjcy0E_f%XhKt-xKF#
zYR|7=KX90D%M9j^zt-#h-Jtzxqm$mA>dmiT3HjKp+`sbn%CA?r-mPA_wPWHh+pTT;
zLp_r7(k5KAv2&ZyE`C}e?r>^N&4q&h%#~$5+f|d!T3r{;j8K2UzO-G{;<mi!)caHH
zr;0x1e!8cqJbL==GS43&Kf-<l{_y(|_d_z};iQ7dAD%muYLsJo=3agLJo)pR=Bntc
zM!vh_f(@4TY>BS&JmsbDvEJk8iTPJ_c|DUa$z6GK&t`kYo(f&IIS2M$z4~pV#rmcw
zW<OTZ3deR`i_N+JoU<=^w|OMqzQVUTGSBeHoEf5*6}qdB3Kn|Er0<wIe+PT1@{Z@*
zeCGa}!IjY?y1rOphLzdsGgXQgDjjO8Zl#OAUGa8KVeidd`tO6MTz_g(w`xVqhA#)}
zB8`1511dLp+rHAf@JeCBdxiar<X0U0uDkJbmCEP)Y!+X{??sv`-7H~#kj=l~_g0T<
z?d6X)&u5IWSYUpq^}{)Tl{&@`S--!3tdEu4Gds_8HvflxuYRy3Jbs+^dH&P1;>X@!
z_Olh7{39O8P*`z9<B$We2;eO6h%9Dc;1&j9Muu5)Bp4VNQ!+y$N+NuHtdjF{^%7I^
zlT!66atnZ}85nFTtboki)RIJnirk#MVyg;UC9n!BAR8pCucQE0Qj%?}6yY17;GAES
zs$imLqGzCF$EBd4U{jQmW)<Y(2GtJa*(zm}loVL$>z9|8>y;bp<rk&v8(Lag>Khp8
z8yV>WRp=I1=9MH?=;jqGLkxkL<C0pOT$EW*l9`{U05Uf*DZjMDR!IqD5gb6>nOgw2
zD6bgmE1>`MD-sLz4fPE4;U)t$+5r7%<y@4SSdw29lAoVr=LiY}1<%~X^wgl##FR=K
zeRLI2D{b^a?m%)E#M59=ps($?fI49zXvZb}w2BWHs7{_Pjv*3LlmGnxZ_f+_&abxl
za4>VFRr{u=BmhB@0)s~Qff<`jAKTlp`WPHfVBWlUnX%D9i5n_`cN*4k%;aVG{$8kR
TN46Y4D2_Z`{an^LB{Ts5ydInz

literal 0
HcmV?d00001

diff --git a/plugins/MultiSites/images/arrow_up_red.png b/plugins/MultiSites/images/arrow_up_red.png
new file mode 100644
index 0000000000000000000000000000000000000000..8135545c32cae0c571e754e42de1bc3622d5da5d
GIT binary patch
literal 1528
zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9Sn@VE&Nl>>S|f?5q$_l%JNFlghxL
zF|jxFZvO2M5&O>km?dKN3pV!giFU6K4UXO^Ew%O-o9E=EFP)@zp1q;9<YZ}{RPc4P
zZI^RH=YM0$=lQ|hu!&u6LWPqQ&yjDN-ZF0S40aT~s<Onk<d#Fm<Zn%@3f8R;-W_{v
z$HevZme0%W-d{9zI37Oh@eEJNgnOT2P3KSSpFd-ob(kXOc}Mjx4$GHS`|XO+W70d;
z>VEBTyyC%o=Ipm#|1T~LTe+NBWu8+`xNWW6$ION)E3Mb@E8KJY`9br(<DHK-k7V`K
zIwBG)rajg<Y%C+sZxQ@TBWYUqlIvTw9;qJrYi#&4hv&0Q(^h4F-B(h(&Qt}Ky`7bK
zDPos@!2k26`DRfct3JN`^h~Y)(eD1MaplLa2-L63-syQnUwPlNAChYIq96Aji&5>Z
z(0BMWb5`||LqAWNi@gqhuW+w(N7j$ll>z%Q&Q4L=ky})G&TduPoa|lZUAE2Qg7;Tl
zcAEHH*<os0@tXLK>esy+FYGsXr|a`9s!r_nV%2x<1@|u>JKa$&Q2*lAE0*(-5zErz
zp8jjq?u+Lu7PzLnIpm35r_0_2#~j{WUw&+duH}Qribc^zvBrHOPX8t)vu*C!Iq`Fz
z^V*g<(z9ltF1CMSw^eK5`77&IO-tP?>rx}pr)shw;V{oTtB4JZMk^+?^X!u?2n=Rs
z_L&lJC1{F7=ki3p)VGyS8x9v9nZdi}`b<-|%<~Tg-?hlhE)i~hbNso2<|OBo89fa?
z_f+yH9#-kTBv@2%d7Di4`J}ryzkIecxuE@6w)xD?d2aC{@7Gjcy0E_f%XhKt-xKF#
zYR|7=KX90D%M9j^zt-#h-Jtzxqm$mA>dmiT3HjKp+`sbn%CA?r-mPA_wPWHh+pTT;
zLp_r7(k5KAv2&ZyE`C}e?r>^N&4q&h%#~$5+f|d!T3r{;j8K2UzO-G{;<mi!)caHH
zr;0x1e!8cqJbL==GS43&Kf-<l{_y(|_d_z};iQ7dAD%muYLsJo=3agLJo)pR=Bntc
zM!vh_f(@4TY>BS&JmsbDvEJk8iTPJ_c|DUa$z6GK&t`kYo(f&IIS2M$z4~pV#rmcw
zW<OTZ3deR`i_N+JoU<=^w|OMqzQVUTGSBeHoEf5*6}qdB3Kn|Er0<wIe+PT1@{Z@*
zeCGa}!IjY?y1rOphLzdsGgXQgDjjO8Zl#OAUGa8KVeidd`tO6MTz_g(w`xVqhA#)}
zB8`1511dLp+rHAf@JeCBdxiar<X0U0uDkJbmCEP)Y!+X{??sv`-7H~#kj=l~_g0T<
z?d6X)&u5IWSYUpq^}{)Tl{&@`S--!3tdEu4Gds_8HvflxuYRy3Jbs+^dH&P1;>X@!
z_Olh7{39O8P*`z9<B$We2;eO6h%9Dc;1&j9Muu5)Bp4VNQ!+y$N+NuHtdjF{^%7I^
zlT!66atnZ}85nFTtboki)RIJnirk#MVyg;UC9n!BAR8pCucQE0Qj%?}6yY17;GAES
zs$imLqGzCF$EBd4U{jQmW)<Y(2GtJa*(zm}loVL$>z9|8>y;bp<rk&v8(Lag>Khp8
z8yV>WRp=I1=9MH?=;jqGLkxkL<C0pOT$EW*l9`{U05Uf*DZjMDR!IqD5gb6>nOgw2
zD6bgmE1>`MD-sLz4fPE4;U)t$+5r7%<y@4SSdw29lAoVr=LiY}1<%~X^wgl##FR=K
zeRLI2D{b^a?m%)E#M59=ps($?fI49zXvZb}w2BWHsCJ$%jv*3LlmGnxZ_mv0=k$rc
z=MMmZNwSf$PY-9T(A={vdJXG3KIT{PwW$~-wCrTOD>B1+#)b?h#wpqi4Cj(%<nw#~
QSb^fl)78&qol`;+0Djw^*Z=?k

literal 0
HcmV?d00001

-- 
GitLab