1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
|
<?php
/**
* Matomo - free/libre analytics platform
*
* @link https://matomo.org
* @license https://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
namespace Piwik\Plugins\Annotations;
use Piwik\Date;
use Piwik\Period;
use Piwik\Piwik;
use Piwik\Plugins\CoreVisualizations\Visualizations\JqplotGraph\Evolution as EvolutionViz;
/**
* Annotations plugins. Provides the ability to attach text notes to
* dates for each site. Notes can be viewed, modified, deleted or starred.
*
*/
class Annotations extends \Piwik\Plugin
{
/**
* @see \Piwik\Plugin::registerEvents
*/
public function registerEvents()
{
return array(
'AssetManager.getStylesheetFiles' => 'getStylesheetFiles',
'AssetManager.getJavaScriptFiles' => 'getJsFiles',
'Translate.getClientSideTranslationKeys' => 'getClientSideTranslationKeys',
);
}
public function getClientSideTranslationKeys(&$translationKeys)
{
$translationKeys[] = 'Intl_Today';
}
/**
* Adds css files for this plugin to the list in the event notification.
*/
public function getStylesheetFiles(&$stylesheets)
{
$stylesheets[] = "plugins/Annotations/stylesheets/annotations.less";
}
/**
* Adds js files for this plugin to the list in the event notification.
*/
public function getJsFiles(&$jsFiles)
{
$jsFiles[] = "plugins/Annotations/javascripts/annotations.js";
}
/**
* Returns start & end dates for the range described by a period and optional lastN
* argument.
*
* @param string|bool $date The start date of the period (or the date range of a range
* period).
* @param string $period The period type ('day', 'week', 'month', 'year' or 'range').
* @param bool|int $lastN Whether to include the last N periods in the range or not.
* Ignored if period == range.
* @param int|null $idSite the id of the current site, used to get timezone
*
* @return Date[]|bool[] array of Date objects or array(false, false)
*/
public static function getDateRangeForPeriod($date, $period, $lastN = false, ?int $idSite = null): array
{
if ($date === false) {
return [false, false];
}
$isMultiplePeriod = Period\Range::isMultiplePeriod($date, $period);
// if the range is just a normal period (or the period is a range in which case lastN is ignored)
if ($period == 'range') {
$oPeriod = new Period\Range('day', $date);
$startDate = $oPeriod->getDateStart()->getStartOfDay();
$endDate = $oPeriod->getDateEnd()->getStartOfDay();
} elseif ($lastN == false && !$isMultiplePeriod) {
$oPeriod = Period\Factory::build($period, Date::factory($date));
$startDate = $oPeriod->getDateStart();
$endDate = $oPeriod->getDateEnd();
} else { // if the range includes the last N periods or is a multiple period
if (!$isMultiplePeriod) {
[$date, $lastN] = EvolutionViz::getDateRangeAndLastN($period, $date, $lastN, $idSite);
}
[$startDate, $endDate] = explode(',', $date);
$startDate = Date::factory($startDate);
$endDate = Date::factory($endDate);
}
return [$startDate, $endDate];
}
/**
* Returns true if the current user can modify or delete a specific annotation.
*
* A user can modify/delete a note if the user has write access for the site OR
* the user has view access, is not the anonymous user and is the user that
* created the note in question.
*
* @param array $annotation The annotation.
* @return bool
*/
public static function canUserModifyOrDelete(array $annotation): bool
{
// user can save if user is admin or if has view access, is not anonymous & is user who wrote note
return Piwik::isUserHasWriteAccess($annotation['idsite'])
|| (!Piwik::isUserIsAnonymous()
&& Piwik::getCurrentUserLogin() === $annotation['user']);
}
}
|