Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/matomo-org/matomo.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/VisitsSummary')
-rw-r--r--plugins/VisitsSummary/API.php3
-rw-r--r--plugins/VisitsSummary/Controller.php134
-rw-r--r--plugins/VisitsSummary/Menu.php20
-rw-r--r--plugins/VisitsSummary/Reports/Get.php147
-rw-r--r--plugins/VisitsSummary/Widgets.php22
-rw-r--r--plugins/VisitsSummary/Widgets/Index.php47
-rw-r--r--plugins/VisitsSummary/lang/en.json30
7 files changed, 234 insertions, 169 deletions
diff --git a/plugins/VisitsSummary/API.php b/plugins/VisitsSummary/API.php
index b80c505fbb..c46bd93b7b 100644
--- a/plugins/VisitsSummary/API.php
+++ b/plugins/VisitsSummary/API.php
@@ -12,6 +12,7 @@ use Piwik\Archive;
use Piwik\Metrics\Formatter;
use Piwik\Piwik;
use Piwik\Plugin\Report;
+use Piwik\Plugin\Reports;
use Piwik\SettingsPiwik;
/**
@@ -29,7 +30,7 @@ class API extends \Piwik\Plugin\API
$requestedColumns = Piwik::getArrayFromApiParameter($columns);
- $report = Report::factory("VisitsSummary", "get");
+ $report = Reports::factory("VisitsSummary", "get");
$columns = $report->getMetricsRequiredForReport($this->getCoreColumns($period), $requestedColumns);
$dataTable = $archive->getDataTableFromNumeric($columns);
diff --git a/plugins/VisitsSummary/Controller.php b/plugins/VisitsSummary/Controller.php
index 336ee26937..ca141b7ed8 100644
--- a/plugins/VisitsSummary/Controller.php
+++ b/plugins/VisitsSummary/Controller.php
@@ -12,8 +12,9 @@ use Piwik\API\Request;
use Piwik\Common;
use Piwik\DataTable;
use Piwik\DataTable\Row;
+use Piwik\FrontController;
use Piwik\Piwik;
-use Piwik\Plugins\Actions\API as APIActions;
+use Piwik\Plugins\CoreVisualizations\Visualizations\Sparklines;
use Piwik\Site;
use Piwik\Translation\Translator;
use Piwik\View;
@@ -35,38 +36,32 @@ class Controller extends \Piwik\Plugin\Controller
parent::__construct();
}
- public function index()
+ /**
+ * @deprecated used to be a widgetized URL. There to not break widget URLs
+ */
+ public function getSparklines()
{
- $view = new View('@VisitsSummary/index');
- $this->setPeriodVariablesView($view);
- $view->graphEvolutionVisitsSummary = $this->getEvolutionGraph(array(), array('nb_visits'), 'getIndexGraph');
- $this->setSparklinesAndNumbers($view);
- return $view->render();
- }
+ $_GET['forceView'] = '1';
+ $_GET['viewDataTable'] = Sparklines::ID;
- // sparkline.js:81 dataTable.trigger('reload', …); does not remove the old headline,
- // so when updating this graph (such as when selecting a different metric)
- // ONLY the graph should be returned
- public function getIndexGraph()
- {
- return $this->getEvolutionGraph(array(), array(), __FUNCTION__);
+ return FrontController::getInstance()->fetchDispatch('VisitsSummary', 'get');
}
- public function getSparklines()
+ /**
+ * @deprecated used to be a widgetized URL. There to not break widget URLs
+ */
+ public function index()
{
- $view = new View('@VisitsSummary/getSparklines');
- $this->setPeriodVariablesView($view);
- $this->setSparklinesAndNumbers($view);
- return $view->render();
+ $_GET['containerId'] = 'VisitOverviewWithGraph';
+
+ return FrontController::getInstance()->fetchDispatch('CoreHome', 'renderWidgetContainer');
}
- public function getEvolutionGraph(array $columns = array(), array $defaultColumns = array(), $callingAction = __FUNCTION__)
+ public function getEvolutionGraph()
{
- if (empty($columns)) {
- $columns = Common::getRequestVar('columns', false);
- if (false !== $columns) {
- $columns = Piwik::getArrayFromApiParameter($columns);
- }
+ $columns = Common::getRequestVar('columns', false);
+ if (false !== $columns) {
+ $columns = Piwik::getArrayFromApiParameter($columns);
}
$documentation = $this->translator->translate('VisitsSummary_VisitsSummaryDocumentation') . '<br />'
@@ -116,11 +111,11 @@ class Controller extends \Piwik\Plugin\Controller
}
// $callingAction may be specified to distinguish between
// "VisitsSummary_WidgetLastVisits" and "VisitsSummary_WidgetOverviewGraph"
- $view = $this->getLastUnitGraphAcrossPlugins($this->pluginName, $callingAction, $columns,
+ $view = $this->getLastUnitGraphAcrossPlugins($this->pluginName, __FUNCTION__, $columns,
$selectableColumns, $documentation);
- if (empty($view->config->columns_to_display) && !empty($defaultColumns)) {
- $view->config->columns_to_display = $defaultColumns;
+ if (empty($view->config->columns_to_display)) {
+ $view->config->columns_to_display = array('nb_visits');
}
return $this->renderView($view);
@@ -137,87 +132,4 @@ class Controller extends \Piwik\Plugin\Controller
return empty($result) ? new DataTable() : $result;
}
-
- public static function getVisits()
- {
- $requestString = "method=VisitsSummary.getVisits" .
- "&format=original" .
- "&disable_generic_filters=1";
- $request = new Request($requestString);
- return $request->process();
- }
-
- protected function setSparklinesAndNumbers($view)
- {
- $view->urlSparklineNbVisits = $this->getUrlSparkline('getEvolutionGraph', array('columns' => $view->displayUniqueVisitors ? array('nb_visits', 'nb_uniq_visitors') : array('nb_visits')));
- $view->urlSparklineNbUsers = $this->getUrlSparkline('getEvolutionGraph', array('columns' => array('nb_users')));
- $view->urlSparklineNbPageviews = $this->getUrlSparkline('getEvolutionGraph', array('columns' => array('nb_pageviews', 'nb_uniq_pageviews')));
- $view->urlSparklineNbDownloads = $this->getUrlSparkline('getEvolutionGraph', array('columns' => array('nb_downloads', 'nb_uniq_downloads')));
- $view->urlSparklineNbOutlinks = $this->getUrlSparkline('getEvolutionGraph', array('columns' => array('nb_outlinks', 'nb_uniq_outlinks')));
- $view->urlSparklineAvgVisitDuration = $this->getUrlSparkline('getEvolutionGraph', array('columns' => array('avg_time_on_site')));
- $view->urlSparklineMaxActions = $this->getUrlSparkline('getEvolutionGraph', array('columns' => array('max_actions')));
- $view->urlSparklineActionsPerVisit = $this->getUrlSparkline('getEvolutionGraph', array('columns' => array('nb_actions_per_visit')));
- $view->urlSparklineBounceRate = $this->getUrlSparkline('getEvolutionGraph', array('columns' => array('bounce_rate')));
- $view->urlSparklineAvgGenerationTime = $this->getUrlSparkline('getEvolutionGraph', array('columns' => array('avg_time_generation')));
-
- $idSite = Common::getRequestVar('idSite');
- $displaySiteSearch = Site::isSiteSearchEnabledFor($idSite);
- if ($displaySiteSearch) {
- $view->urlSparklineNbSearches = $this->getUrlSparkline('getEvolutionGraph', array('columns' => array('nb_searches', 'nb_keywords')));
- }
- $view->displaySiteSearch = $displaySiteSearch;
-
- $dataTableVisit = self::getVisitsSummary();
- $dataRow = $dataTableVisit->getRowsCount() == 0 ? new Row() : $dataTableVisit->getFirstRow();
- $view->nbUniqVisitors = (int)$dataRow->getColumn('nb_uniq_visitors');
- $view->nbUsers = (int)$dataRow->getColumn('nb_users');
- $nbVisits = (int)$dataRow->getColumn('nb_visits');
- $view->nbVisits = $nbVisits;
-
- $view->averageVisitDuration = $dataRow->getColumn('avg_time_on_site');
- $view->bounceRate = $dataRow->getColumn('bounce_rate');
- $view->maxActions = (int)$dataRow->getColumn('max_actions');
- $view->nbActionsPerVisit = $dataRow->getColumn('nb_actions_per_visit');
-
- if (Common::isActionsPluginEnabled()) {
- $view->showActionsPluginReports = true;
-
- $dataTableActions = Request::processRequest("Actions.get", array(
- 'idSite' => $idSite,
- 'period' => Common::getRequestVar('period'),
- 'date' => Common::getRequestVar('date'),
- 'segment' => Request::getRawSegmentFromRequest()
- ), $defaultParams = array());
-
- $dataActionsRow =
- $dataTableActions->getRowsCount() == 0 ? new Row() : $dataTableActions->getFirstRow();
-
- $view->nbPageviews = (int)$dataActionsRow->getColumn('nb_pageviews');
- $view->nbUniquePageviews = (int)$dataActionsRow->getColumn('nb_uniq_pageviews');
- $view->nbDownloads = (int)$dataActionsRow->getColumn('nb_downloads');
- $view->nbUniqueDownloads = (int)$dataActionsRow->getColumn('nb_uniq_downloads');
- $view->nbOutlinks = (int)$dataActionsRow->getColumn('nb_outlinks');
- $view->nbUniqueOutlinks = (int)$dataActionsRow->getColumn('nb_uniq_outlinks');
- $view->averageGenerationTime = $dataActionsRow->getColumn('avg_time_generation');
-
- if ($displaySiteSearch) {
- $view->nbSearches = (int)$dataActionsRow->getColumn('nb_searches');
- $view->nbKeywords = (int)$dataActionsRow->getColumn('nb_keywords');
- }
-
- // backward compatibility:
- // show actions if the finer metrics are not archived
- $view->showOnlyActions = false;
- if ($dataActionsRow->getColumn('nb_pageviews')
- + $dataActionsRow->getColumn('nb_downloads')
- + $dataActionsRow->getColumn('nb_outlinks') == 0
- && $dataRow->getColumn('nb_actions') > 0
- ) {
- $view->showOnlyActions = true;
- $view->nbActions = $dataRow->getColumn('nb_actions');
- $view->urlSparklineNbActions = $this->getUrlSparkline('getEvolutionGraph', array('columns' => array('nb_actions')));
- }
- }
-
- }
}
diff --git a/plugins/VisitsSummary/Menu.php b/plugins/VisitsSummary/Menu.php
deleted file mode 100644
index 1b87e46be9..0000000000
--- a/plugins/VisitsSummary/Menu.php
+++ /dev/null
@@ -1,20 +0,0 @@
-<?php
-/**
- * Piwik - free/libre analytics platform
- *
- * @link http://piwik.org
- * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- *
- */
-namespace Piwik\Plugins\VisitsSummary;
-
-use Piwik\Menu\MenuReporting;
-
-class Menu extends \Piwik\Plugin\Menu
-{
- public function configureReportingMenu(MenuReporting $menu)
- {
- $menu->addVisitorsItem('', array('module' => 'VisitsSummary', 'action' => 'index'), 10);
- $menu->addVisitorsItem('General_Overview', array('module' => 'VisitsSummary', 'action' => 'index'), 1);
- }
-}
diff --git a/plugins/VisitsSummary/Reports/Get.php b/plugins/VisitsSummary/Reports/Get.php
index 55696873be..7fb95d2950 100644
--- a/plugins/VisitsSummary/Reports/Get.php
+++ b/plugins/VisitsSummary/Reports/Get.php
@@ -8,11 +8,23 @@
*/
namespace Piwik\Plugins\VisitsSummary\Reports;
+use Piwik\Common;
+use Piwik\Container\StaticContainer;
+use Piwik\DataTable;
use Piwik\DataTable\DataTableInterface;
+use Piwik\Metrics\Formatter;
use Piwik\Piwik;
+use Piwik\Plugin\ViewDataTable;
use Piwik\Plugins\CoreHome\Columns\Metrics\ActionsPerVisit;
use Piwik\Plugins\CoreHome\Columns\Metrics\AverageTimeOnSite;
use Piwik\Plugins\CoreHome\Columns\Metrics\BounceRate;
+use Piwik\Plugins\CoreHome\Columns\UserId;
+use Piwik\Plugins\CoreVisualizations\Visualizations\JqplotGraph\Evolution;
+use Piwik\Plugins\CoreVisualizations\Visualizations\Sparklines;
+use Piwik\Report\ReportWidgetFactory;
+use Piwik\SettingsPiwik;
+use Piwik\Site;
+use Piwik\Widget\WidgetsList;
class Get extends \Piwik\Plugin\Report
{
@@ -21,7 +33,7 @@ class Get extends \Piwik\Plugin\Report
protected function init()
{
parent::init();
- $this->category = 'VisitsSummary_VisitsSummary';
+ $this->categoryId = 'General_Visitors';
$this->name = Piwik::translate('VisitsSummary_VisitsSummary');
$this->documentation = ''; // TODO
$this->processedMetrics = array(
@@ -36,12 +48,145 @@ class Get extends \Piwik\Plugin\Report
'nb_actions',
'max_actions'
);
+ $this->subcategoryId = 'General_Overview';
// Used to process metrics, not displayed/used directly
// 'sum_visit_length',
// 'nb_visits_converted',
$this->order = 1;
}
+ public function configureWidgets(WidgetsList $widgetsList, ReportWidgetFactory $factory)
+ {
+ $widgetsList->addWidgetConfig(
+ $factory->createWidget()
+ ->setName('VisitsSummary_WidgetLastVisits')
+ ->forceViewDataTable(Evolution::ID)
+ ->setAction('getEvolutionGraph')
+ ->setOrder(5)
+ );
+
+ $widgetsList->addWidgetConfig(
+ $factory->createWidget()
+ ->setName('VisitsSummary_WidgetVisits')
+ ->forceViewDataTable(Sparklines::ID)
+ ->setOrder(10)
+ );
+ }
+
+ public function configureView(ViewDataTable $view)
+ {
+ if ($view->isViewDataTableId(Sparklines::ID)) {
+ /** @var Sparklines $view */
+ $view->requestConfig->apiMethodToRequestDataTable = 'API.get';
+ $this->addSparklineColumns($view);
+ $view->config->addTranslations($this->getSparklineTranslations());
+ $view->config->filters[] = function (DataTable $table) use ($view) {
+ $firstRow = $table->getFirstRow();
+
+ if (($firstRow->getColumn('nb_pageviews')
+ + $firstRow->getColumn('nb_downloads')
+ + $firstRow->getColumn('nb_outlinks')) == 0
+ && $firstRow->getColumn('nb_actions') > 0) {
+ $view->config->removeSparklineMetric(array('nb_downloads', 'nb_uniq_downloads'));
+ $view->config->removeSparklineMetric(array('nb_outlinks', 'nb_uniq_outlinks'));
+ $view->config->removeSparklineMetric(array('nb_pageviews', 'nb_uniq_pageviews'));
+ $view->config->removeSparklineMetric(array('nb_searches', 'nb_keywords'));
+ } else {
+ $view->config->removeSparklineMetric(array('nb_actions'));
+ }
+
+ $nbUsers = $firstRow->getColumn('nb_users');
+ if (!is_numeric($nbUsers) || 0 >= $nbUsers) {
+ $view->config->replaceSparklineMetric(array('nb_users'), '');
+ }
+
+ $avgGenerationTime = $firstRow->getColumn('avg_time_generation');
+ if (false === $avgGenerationTime) {
+ // fix avgGenerationTime is not formatted if value is false
+ /** @var Formatter $formatter */
+ $formatter = StaticContainer::get('Piwik\Metrics\Formatter');
+ $avgGenerationTime = $formatter->getPrettyTimeFromSeconds($avgGenerationTime, true);
+ $firstRow->setColumn('avg_time_generation', $avgGenerationTime);
+ }
+ };
+ }
+ }
+
+ private function getSparklineTranslations()
+ {
+ $translations = array(
+ 'nb_actions' => 'NbActionsDescription',
+ 'nb_visits' => 'NbVisitsDescription',
+ 'nb_users' => 'NbUsersDescription',
+ 'nb_uniq_visitors' => 'NbUniqueVisitors',
+ 'avg_time_generation' => 'AverageGenerationTime',
+ 'avg_time_on_site' => 'AverageVisitDuration',
+ 'max_actions' => 'MaxNbActions',
+ 'nb_actions_per_visit' => 'NbActionsPerVisit',
+ 'nb_downloads' => 'NbDownloadsDescription',
+ 'nb_uniq_downloads' => 'NbUniqueDownloadsDescription',
+ 'nb_outlinks' => 'NbOutlinksDescription',
+ 'nb_uniq_outlinks' => 'NbUniqueOutlinksDescription',
+ 'nb_keywords' => 'NbKeywordsDescription',
+ 'nb_searches' => 'NbSearchesDescription',
+ 'nb_pageviews' => 'NbPageviewsDescription',
+ 'nb_uniq_pageviews' => 'NbUniquePageviewsDescription',
+ 'bounce_rate' => 'NbVisitsBounced',
+ );
+
+ foreach ($translations as $metric => $key) {
+ $translations[$metric] = Piwik::translate('VisitsSummary_' . $key);
+ }
+
+ return $translations;
+ }
+
+ private function addSparklineColumns(Sparklines $view)
+ {
+ $currentPeriod = Common::getRequestVar('period');
+ $currentIdSite = Common::getRequestVar('idSite');
+ $currentDate = Common::getRequestVar('date');
+ $displayUniqueVisitors = SettingsPiwik::isUniqueVisitorsEnabled($currentPeriod);
+
+ $isActionPluginEnabled = Common::isActionsPluginEnabled();
+
+ $view->config->addSparklineMetric($displayUniqueVisitors ? array('nb_visits', 'nb_uniq_visitors') : array('nb_visits'), 5);
+
+ if ($isActionPluginEnabled) {
+ $view->config->addSparklineMetric(array('nb_actions'), 10); // either actions or pageviews will be displayed
+ $view->config->addSparklineMetric(array('nb_pageviews', 'nb_uniq_pageviews'), 20);
+ } else {
+ // make sure to still create a div on the right side for this, just leave it empty
+ $view->config->addPlaceholder(10);
+ }
+
+ $userId = new UserId();
+ if ($userId->isUsedInAtLeastOneSite($currentIdSite, $currentPeriod, $currentDate)) {
+ $view->config->addSparklineMetric(array('nb_users'), 30);
+ $view->config->addPlaceholder(31);
+ }
+
+ $view->config->addSparklineMetric(array('avg_time_on_site'), 40);
+
+ $idSite = Common::getRequestVar('idSite');
+ if ($isActionPluginEnabled && Site::isSiteSearchEnabledFor($idSite)) {
+ $view->config->addSparklineMetric(array('nb_searches', 'nb_keywords'), 50);
+ } else {
+ // make sure to still create a div on the right side for this, just leave it empty
+ $view->config->addPlaceholder(50);
+ }
+
+ $view->config->addSparklineMetric(array('bounce_rate'), 60);
+
+ if ($isActionPluginEnabled) {
+ $view->config->addSparklineMetric(array('nb_downloads', 'nb_uniq_downloads'), 70);
+ $view->config->addSparklineMetric(array('nb_actions_per_visit'), 71);
+ $view->config->addSparklineMetric(array('nb_outlinks', 'nb_uniq_outlinks'), 72);
+ $view->config->addSparklineMetric(array('avg_time_generation'), 73);
+ $view->config->addSparklineMetric(array('max_actions'), 74);
+ }
+ }
+
public function getMetrics()
{
$metrics = parent::getMetrics();
diff --git a/plugins/VisitsSummary/Widgets.php b/plugins/VisitsSummary/Widgets.php
deleted file mode 100644
index 5ec7eef56e..0000000000
--- a/plugins/VisitsSummary/Widgets.php
+++ /dev/null
@@ -1,22 +0,0 @@
-<?php
-/**
- * Piwik - free/libre analytics platform
- *
- * @link http://piwik.org
- * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- *
- */
-namespace Piwik\Plugins\VisitsSummary;
-
-class Widgets extends \Piwik\Plugin\Widgets
-{
- protected $category = 'VisitsSummary_VisitsSummary';
-
- public function init()
- {
- $this->addWidget('VisitsSummary_WidgetLastVisits', 'getEvolutionGraph', array('columns' => array('nb_visits')));
- $this->addWidget('VisitsSummary_WidgetVisits', 'getSparklines');
- $this->addWidget('VisitsSummary_WidgetOverviewGraph', 'index');
- }
-
-}
diff --git a/plugins/VisitsSummary/Widgets/Index.php b/plugins/VisitsSummary/Widgets/Index.php
new file mode 100644
index 0000000000..1b39fad7c6
--- /dev/null
+++ b/plugins/VisitsSummary/Widgets/Index.php
@@ -0,0 +1,47 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ */
+namespace Piwik\Plugins\VisitsSummary\Widgets;
+
+use Piwik\Plugin\Report;
+use Piwik\Plugins\CoreVisualizations\Visualizations\JqplotGraph\Evolution;
+use Piwik\Plugins\CoreVisualizations\Visualizations\Sparklines;
+use Piwik\Plugin\Reports;
+use Piwik\Report\ReportWidgetFactory;
+use Piwik\Widget\WidgetsList;
+
+class Index extends \Piwik\Widget\WidgetContainerConfig
+{
+ protected $categoryId = 'General_Visitors';
+ protected $name = 'VisitsSummary_WidgetOverviewGraph';
+ protected $id = 'VisitOverviewWithGraph';
+ protected $isWidgetizable = true;
+
+ public function isEnabled()
+ {
+ return Reports::factory('VisitsSummary', 'get')->isEnabled();
+ }
+
+ public function getWidgetConfigs()
+ {
+ $report = Reports::factory('VisitsSummary', 'get');
+
+ $factory = new ReportWidgetFactory($report);
+ $widgets = array();
+
+ $list = new WidgetsList();
+ $report->configureWidgets($list, $factory);
+
+ foreach ($list->getWidgetConfigs() as $config) {
+ $config->setIsNotWidgetizable();
+ $widgets[] = $config;
+ }
+
+ return $widgets;
+ }
+}
diff --git a/plugins/VisitsSummary/lang/en.json b/plugins/VisitsSummary/lang/en.json
index e4a46bc5ae..fc9d3c4777 100644
--- a/plugins/VisitsSummary/lang/en.json
+++ b/plugins/VisitsSummary/lang/en.json
@@ -1,22 +1,24 @@
{
"VisitsSummary": {
- "AverageGenerationTime": "%s average generation time",
- "AverageVisitDuration": "%s average visit duration",
+ "AverageGenerationTime": "average generation time",
+ "AverageVisitDuration": "average visit duration",
"GenerateQueries": "%s queries executed",
"GenerateTime": "%s seconds to generate the page",
- "MaxNbActions": "%s max actions in one visit",
+ "MaxNbActions": "max actions in one visit",
"NbActionsDescription": "%s actions",
- "NbActionsPerVisit": "%s actions (page views, downloads, outlinks and internal site searches) per visit",
- "NbDownloadsDescription": "%s downloads",
- "NbKeywordsDescription": "%s unique keywords",
- "NbOutlinksDescription": "%s outlinks",
- "NbPageviewsDescription": "%s pageviews",
- "NbSearchesDescription": "%s total searches on your website",
- "NbUniqueDownloadsDescription": "%s unique downloads",
- "NbUniqueOutlinksDescription": "%s unique outlinks",
- "NbUniquePageviewsDescription": "%s unique pageviews",
- "NbUniqueVisitors": "%s unique visitors",
- "NbVisitsBounced": "%s visits have bounced (left the website after one page)",
+ "NbActionsPerVisit": "actions (page views, downloads, outlinks and internal site searches) per visit",
+ "NbDownloadsDescription": "downloads",
+ "NbKeywordsDescription": "unique keywords",
+ "NbOutlinksDescription": "outlinks",
+ "NbPageviewsDescription": "pageviews",
+ "NbSearchesDescription": "total searches on your website",
+ "NbUniqueDownloadsDescription": "unique downloads",
+ "NbUniqueOutlinksDescription": "unique outlinks",
+ "NbUniquePageviewsDescription": "unique pageviews",
+ "NbUniqueVisitors": "unique visitors",
+ "NbUsersDescription": "users",
+ "NbVisitsDescription": "visits",
+ "NbVisitsBounced": "visits have bounced (left the website after one page)",
"PluginDescription": "Reports general analytics metrics: visits, unique visitors, number of actions, bounce rate, etc.",
"VisitsSummary": "Visits Summary",
"VisitsSummaryDocumentation": "This is an overview of the visit evolution.",