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:
-rw-r--r--plugins/CoreHome/CoreHome.php9
-rw-r--r--plugins/CoreHome/angularjs/date-picker/date-picker.directive.js369
-rw-r--r--plugins/CoreHome/angularjs/date-range-picker/date-range-picker.component.html58
-rw-r--r--plugins/CoreHome/angularjs/date-range-picker/date-range-picker.component.js156
-rw-r--r--plugins/CoreHome/angularjs/period-date-picker/period-date-picker.component.html14
-rw-r--r--plugins/CoreHome/angularjs/period-date-picker/period-date-picker.component.js105
-rw-r--r--plugins/CoreHome/angularjs/period-date-picker/period-date-picker.component.less3
-rw-r--r--plugins/CoreHome/angularjs/period-selector/period-selector.directive.html2
-rw-r--r--plugins/CoreHome/angularjs/selector/selector.directive.js125
-rw-r--r--plugins/CoreHome/stylesheets/selector.less (renamed from plugins/CoreHome/angularjs/selector/selector.directive.less)0
-rw-r--r--plugins/CoreHome/vue/dist/CoreHome.umd.js1035
-rw-r--r--plugins/CoreHome/vue/dist/CoreHome.umd.min.js94
-rw-r--r--plugins/CoreHome/vue/src/DatePicker/DatePicker.adapter.ts62
-rw-r--r--plugins/CoreHome/vue/src/DatePicker/DatePicker.vue366
-rw-r--r--plugins/CoreHome/vue/src/DateRangePicker/DateRangePicker.adapter.ts29
-rw-r--r--plugins/CoreHome/vue/src/DateRangePicker/DateRangePicker.less (renamed from plugins/CoreHome/angularjs/date-range-picker/date-range-picker.component.less)0
-rw-r--r--plugins/CoreHome/vue/src/DateRangePicker/DateRangePicker.vue186
-rw-r--r--plugins/CoreHome/vue/src/ExpandOnClick/ExpandOnClick.adapter.ts34
-rw-r--r--plugins/CoreHome/vue/src/ExpandOnClick/ExpandOnClick.ts105
-rw-r--r--plugins/CoreHome/vue/src/ExpandOnHover/ExpandOnHover.adapter.ts33
-rw-r--r--plugins/CoreHome/vue/src/ExpandOnHover/ExpandOnHover.ts73
-rw-r--r--plugins/CoreHome/vue/src/PeriodDatePicker/PeriodDatePicker.adapter.ts26
-rw-r--r--plugins/CoreHome/vue/src/PeriodDatePicker/PeriodDatePicker.vue106
-rw-r--r--plugins/CoreHome/vue/src/createAngularJsAdapter.ts35
-rw-r--r--plugins/CoreHome/vue/src/index.ts10
-rw-r--r--plugins/CoreVue/types/index.d.ts9
26 files changed, 2166 insertions, 878 deletions
diff --git a/plugins/CoreHome/CoreHome.php b/plugins/CoreHome/CoreHome.php
index 27dcb23b03..1992b79e0c 100644
--- a/plugins/CoreHome/CoreHome.php
+++ b/plugins/CoreHome/CoreHome.php
@@ -139,13 +139,12 @@ class CoreHome extends \Piwik\Plugin
$stylesheets[] = "plugins/CoreHome/vue/src/EnrichedHeadline/EnrichedHeadline.less";
$stylesheets[] = "plugins/CoreHome/angularjs/notification/notification.directive.less";
$stylesheets[] = "plugins/CoreHome/angularjs/quick-access/quick-access.directive.less";
- $stylesheets[] = "plugins/CoreHome/angularjs/selector/selector.directive.less";
+ $stylesheets[] = "plugins/CoreHome/stylesheets/selector.less";
$stylesheets[] = "plugins/CoreHome/angularjs/reporting-page/reportingpage.directive.less";
$stylesheets[] = "plugins/CoreHome/angularjs/report-export/reportexport.popover.less";
$stylesheets[] = "plugins/CoreHome/angularjs/widget-bydimension-container/widget-bydimension-container.directive.less";
$stylesheets[] = "plugins/CoreHome/angularjs/progressbar/progressbar.directive.less";
- $stylesheets[] = "plugins/CoreHome/angularjs/date-range-picker/date-range-picker.component.less";
- $stylesheets[] = "plugins/CoreHome/angularjs/period-date-picker/period-date-picker.component.less";
+ $stylesheets[] = "plugins/CoreHome/vue/src/DateRangePicker/DateRangePicker.less";
$stylesheets[] = "plugins/CoreHome/angularjs/period-selector/period-selector.directive.less";
$stylesheets[] = "plugins/CoreHome/angularjs/multipairfield/multipairfield.directive.less";
$stylesheets[] = "plugins/CoreHome/angularjs/dropdown-menu/dropdown-menu.directive.less";
@@ -266,12 +265,8 @@ class CoreHome extends \Piwik\Plugin
$jsFiles[] = "plugins/CoreHome/angularjs/quick-access/quick-access.controller.js";
$jsFiles[] = "plugins/CoreHome/angularjs/quick-access/quick-access.directive.js";
- $jsFiles[] = "plugins/CoreHome/angularjs/selector/selector.directive.js";
$jsFiles[] = "plugins/CoreHome/angularjs/content-table/content-table.directive.js";
- $jsFiles[] = "plugins/CoreHome/angularjs/date-picker/date-picker.directive.js";
- $jsFiles[] = "plugins/CoreHome/angularjs/date-range-picker/date-range-picker.component.js";
- $jsFiles[] = "plugins/CoreHome/angularjs/period-date-picker/period-date-picker.component.js";
$jsFiles[] = "plugins/CoreHome/angularjs/period-selector/period-selector.directive.js";
$jsFiles[] = "plugins/CoreHome/angularjs/period-selector/period-selector.controller.js";
diff --git a/plugins/CoreHome/angularjs/date-picker/date-picker.directive.js b/plugins/CoreHome/angularjs/date-picker/date-picker.directive.js
deleted file mode 100644
index 607c15dbc4..0000000000
--- a/plugins/CoreHome/angularjs/date-picker/date-picker.directive.js
+++ /dev/null
@@ -1,369 +0,0 @@
-/*!
- * Matomo - free/libre analytics platform
- *
- * @link https://matomo.org
- * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- */
-
-/**
- * A wrapper around the jquery UI date picker that allows you to show multiple dates selected
- * or highlighted.
- *
- * Properties:
- * - selectedDates: null or a two element array of Date instances. The first element is the start
- * of the range of selected dates. The second element is the end of the range
- * of selected dates. The range is inclusive.
- * - highlightedDates: null or a two element array of Date instances. The first element is the
- * start of the range of highlighted dates. The second element is the end of
- * the range of highlighted dates. The range is inclusive.
- * - viewDate: The date that should be displayed. The month & year of this date is what will
- * be displayed to the user.
- * - stepMonths: The number of months to move when the left/right arrows are clicked.
- * - disableMonthDropdown: true if the month dropdown should be disabled, false if enabled.
- * - options: extra options to pass the jquery ui's datepicker. They will not be re-applied if
- * the value for this property changes.
- * - cellHover: called when the user hovers over a calendar cell. Called w/ 'date' argument set
- * to the Date of the cell clicked & '$cell' set to the <td> element from the datepicker.
- * - cellHoverLeave: called when the user leaves all of the calendar cells.
- * - dateSelect: called when the user selects a date.
- *
- * Usage:
- * <div piwik-date-picker .../>
- */
-(function () {
- angular.module('piwikApp').directive('piwikDatePicker', piwikDatePicker);
-
- piwikDatePicker.$inject = ['piwik', '$timeout'];
-
- function piwikDatePicker(piwik, $timeout) {
- var DEFAULT_STEP_MONTHS = 1;
-
- return {
- restrict: 'A',
- scope: {
- selectedDateStart: '<',
- selectedDateEnd: '<',
- highlightedDateStart: '<',
- highlightedDateEnd: '<',
- viewDate: '<',
- stepMonths: '<',
- disableMonthDropdown: '<',
- options: '<',
- cellHover: '&',
- cellHoverLeave: '&',
- dateSelect: '&'
- },
- template: '',
- link: function (scope, element) {
- scope.$onChanges = $onChanges;
-
- var customOptions = scope.options || {};
- var datePickerOptions = $.extend({}, piwik.getBaseDatePickerOptions(), customOptions, {
- onChangeMonthYear: function () {
- // datepicker renders the HTML after this hook is called, so we use setTimeout
- // to run some code after the render.
- setTimeout(function () {
- onJqueryUiRenderedPicker();
- });
- }
- });
- element.datepicker(datePickerOptions);
-
- element.on('mouseover', 'tbody td a', function (event) {
- // this event is triggered when a user clicks a date as well. in that case,
- // the originalEvent is null. we don't need to redraw again for that, so
- // we ignore events like that.
- if (event.originalEvent) {
- setDatePickerCellColors();
- }
- });
-
- // on hover cell, execute scope.cellHover()
- element.on('mouseenter', 'tbody td', function () {
- if (!scope.cellHover) {
- return;
- }
-
- var monthYear = getMonthYearDisplayed();
-
- var $dateCell = $(this);
- var dateValue = getCellDate($dateCell, monthYear[0], monthYear[1]);
- scope.cellHover({ date: dateValue, $cell: $dateCell });
-
- $timeout(); // trigger new digest
- });
-
- // overrides jquery UI handler that unhighlights a cell when the mouse leaves it
- element.on('mouseout', 'tbody td a', function () {
- setDatePickerCellColors();
- });
-
- // call scope.cellHover() when mouse leaves table body (can't do event on tbody, for some reason
- // that fails, so we do two events, one on the table & one on thead)
- element
- .on('mouseleave', 'table', onCalendarHoverLeave)
- .on('mouseenter', 'thead', onCalendarHoverLeave);
-
- // make sure whitespace is clickable when the period makes it appropriate
- element.on('click', 'tbody td.ui-datepicker-other-month', handleOtherMonthClick);
-
- // NOTE: using a selector w/ .on() doesn't seem to work for some reason...
- element.on('click', function (e) {
- e.preventDefault();
-
- var $target = $(e.target).closest('a');
- if (!$target.is('.ui-datepicker-next')
- && !$target.is('.ui-datepicker-prev')
- ) {
- return;
- }
-
- onCalendarViewChange();
- });
-
- // when a cell is clicked, invoke the onDateSelected function. this, in conjunction
- // with onJqueryUiRenderedPicker(), overrides the date picker's click behavior.
- element.on('click', 'td[data-month]', function (event) {
- var $cell = $(event.target).closest('td');
- var month = parseInt($cell.attr('data-month'));
- var year = parseInt($cell.attr('data-year'));
- var day = parseInt($cell.children('a,span').text());
- onDateSelected(new Date(year, month, day));
- });
-
- init();
-
- function init() {
- var renderPostProcessed = stepMonthsChanged();
-
- viewDateChanged();
- enableDisableMonthDropdown();
-
- if (!renderPostProcessed) {
- onJqueryUiRenderedPicker();
- }
-
- setDatePickerCellColors();
- }
-
- // remove the ui-state-active class & click handlers for every cell. we bypass
- // the datepicker's date selection logic for smoother browser rendering.
- function onJqueryUiRenderedPicker() {
- element.find('td[data-event]').off('click');
- element.find('.ui-state-active').removeClass('ui-state-active');
- element.find('.ui-datepicker-current-day').removeClass('ui-datepicker-current-day');
-
- // add href to left/right nav in calendar so they can be accessed via keyboard
- element.find('.ui-datepicker-prev,.ui-datepicker-next').attr('href', '');
- }
-
- function $onChanges(changesObj) {
- // redraw when selected/highlighted dates change
- var redraw = changesObj.selectedDateStart
- || changesObj.selectedDateEnd
- || changesObj.highlightedDateStart
- || changesObj.highlightedDateEnd;
-
- if (changesObj.viewDate && viewDateChanged()) {
- redraw = true;
- }
-
- if (changesObj.stepMonths) {
- stepMonthsChanged();
- }
-
- if (changesObj.enableDisableMonthDropdown) {
- enableDisableMonthDropdown();
- }
-
- if (redraw) {
- // timeout ensures the style change happens after jquery datepicker
- // does its own rendering, so we're overriding jquery.
- setDatePickerCellColors();
- }
- }
-
- function viewDateChanged() {
- var date = scope.viewDate;
- if (!date) {
- return;
- }
-
- if (!(date instanceof Date)) {
- try {
- date = $.datepicker.parseDate('yy-mm-dd', date);
- } catch (e) {
- return;
- }
- }
-
- // only change the datepicker date if the date is outside of the current month/year.
- // this avoids a re-render in other cases.
- var monthYear = getMonthYearDisplayed();
- if (monthYear[0] !== date.getMonth() || monthYear[1] !== date.getFullYear()) {
- element.datepicker('setDate', date);
- return true;
- }
-
- return false;
- }
-
- function stepMonthsChanged() {
- var stepMonths = scope.stepMonths || DEFAULT_STEP_MONTHS;
- if (element.datepicker('option', 'stepMonths') === stepMonths) {
- return false;
- }
-
- // setting stepMonths will change the month in view back to the selected date. to avoid
- // we set the selected date to the month in view.
- var currentMonth = $('.ui-datepicker-month', element).val(),
- currentYear = $('.ui-datepicker-year', element).val();
-
- element
- .datepicker('option', 'stepMonths', stepMonths)
- .datepicker('setDate', new Date(currentYear, currentMonth));
-
- onJqueryUiRenderedPicker();
-
- return true;
- }
-
- function onDateSelected(date) {
- if (!scope.dateSelect) {
- return;
- }
-
- scope.dateSelect({
- date: date
- });
-
- // this event comes from jquery, so we must apply manually
- scope.$apply();
- }
-
- function handleOtherMonthClick() {
- if (!$(this).hasClass('ui-state-hover')) {
- return;
- }
-
- var $row = $(this).parent(),
- $tbody = $row.parent();
-
- if ($row.is(':first-child')) {
- // click on first of the month
- $tbody.find('a').first().click();
- } else {
- // click on last of month
- $tbody.find('a').last().click();
- }
- }
-
- function onCalendarHoverLeave() {
- if (!scope.cellHoverLeave) {
- return;
- }
-
- scope.cellHoverLeave();
-
- $timeout();
- }
-
- function onCalendarViewChange() {
- // clicking left/right re-enables the month dropdown, so we disable it again
- enableDisableMonthDropdown();
-
- setDatePickerCellColors();
- }
-
- function setDatePickerCellColors() {
- var $calendarTable = element.find('.ui-datepicker-calendar');
-
- var monthYear = getMonthYearDisplayed();
-
- // highlight the rest of the cells by first getting the date for the first cell
- // in the calendar, then just incrementing by one for the rest of the cells.
- var $cells = $calendarTable.find('td');
- var $firstDateCell = $cells.first();
- var currentDate = getCellDate($firstDateCell, monthYear[0], monthYear[1]);
-
- $cells.each(function () {
- setDateCellColor($(this), currentDate);
-
- currentDate.setDate(currentDate.getDate() + 1);
- });
- }
-
- function getMonthYearDisplayed() {
- var $firstCellWithMonth = element.find('td[data-month]');
- var month = parseInt($firstCellWithMonth.attr('data-month'));
- var year = parseInt($firstCellWithMonth.attr('data-year'));
- return [month, year];
- }
-
- function setDateCellColor($dateCell, dateValue) {
- var $dateCellLink = $dateCell.children('a');
-
- if (scope.selectedDateStart
- && scope.selectedDateEnd
- && dateValue >= scope.selectedDateStart
- && dateValue <= scope.selectedDateEnd
- ) {
- $dateCell.addClass('ui-datepicker-current-period');
- } else {
- $dateCell.removeClass('ui-datepicker-current-period');
- }
-
- if (scope.highlightedDateStart
- && scope.highlightedDateEnd
- && dateValue >= scope.highlightedDateStart
- && dateValue <= scope.highlightedDateEnd
- ) {
- // other-month cells don't have links, so the <td> must have the ui-state-hover class
- var elementToAddClassTo = $dateCellLink.length ? $dateCellLink : $dateCell;
- elementToAddClassTo.addClass('ui-state-hover');
- } else {
- $dateCell.removeClass('ui-state-hover');
- $dateCellLink.removeClass('ui-state-hover');
- }
- }
-
- function getCellDate($dateCell, month, year) {
- if ($dateCell.hasClass('ui-datepicker-other-month')) {
- return getOtherMonthDate($dateCell, month, year);
- }
-
- var day = parseInt($dateCell.children('a,span').text());
-
- return new Date(year, month, day);
- }
-
- function getOtherMonthDate($dateCell, month, year) {
- var date;
-
- var $row = $dateCell.parent();
- var $rowCells = $row.children('td');
-
- // if in the first row, the date cell is before the current month
- if ($row.is(':first-child')) {
- var $firstDateInMonth = $row.children('td:not(.ui-datepicker-other-month)').first();
-
- date = getCellDate($firstDateInMonth, month, year);
- date.setDate($rowCells.index($dateCell) - $rowCells.index($firstDateInMonth) + 1);
- return date;
- }
-
- // the date cell is after the current month
- var $lastDateInMonth = $row.children('td:not(.ui-datepicker-other-month)').last();
-
- date = getCellDate($lastDateInMonth, month, year);
- date.setDate(date.getDate() + $rowCells.index($dateCell) - $rowCells.index($lastDateInMonth));
- return date;
- }
-
- function enableDisableMonthDropdown() {
- element.find('.ui-datepicker-month').attr('disabled', scope.disableMonthDropdown);
- }
- }
- };
- }
-})(); \ No newline at end of file
diff --git a/plugins/CoreHome/angularjs/date-range-picker/date-range-picker.component.html b/plugins/CoreHome/angularjs/date-range-picker/date-range-picker.component.html
deleted file mode 100644
index 4ff9a56e63..0000000000
--- a/plugins/CoreHome/angularjs/date-range-picker/date-range-picker.component.html
+++ /dev/null
@@ -1,58 +0,0 @@
-<div id="calendarRangeFrom">
- <h6>
- {{ 'General_DateRangeFrom'|translate }}
- <input
- type="text"
- id="inputCalendarFrom"
- name="inputCalendarFrom"
- class="browser-default"
- ng-class="{invalid: $ctrl.startDateInvalid}"
- ng-model="$ctrl.startDate"
- ng-change="$ctrl.onRangeInputChanged('from')"
- ng-keyup="$ctrl.handleEnterPress($event)"
- />
- </h6>
-
- <div
- id="calendarFrom"
- piwik-date-picker
- view-date="$ctrl.startDate"
- selected-date-start="$ctrl.fromPickerSelectedDates[0]"
- selected-date-end="$ctrl.fromPickerSelectedDates[1]"
- highlighted-date-start="$ctrl.fromPickerHighlightedDates[0]"
- highlighted-date-end="$ctrl.fromPickerHighlightedDates[1]"
- date-select="$ctrl.setStartRangeDate(date)"
- cell-hover="$ctrl.fromPickerHighlightedDates = $ctrl.getNewHighlightedDates(date, $cell)"
- cell-hover-leave="$ctrl.fromPickerHighlightedDates = null"
- >
- </div>
-</div>
-<div id="calendarRangeTo">
- <h6>
- {{ 'General_DateRangeTo'|translate }}
- <input
- type="text"
- id="inputCalendarTo"
- name="inputCalendarTo"
- class="browser-default"
- ng-class="{invalid: $ctrl.endDateInvalid}"
- ng-model="$ctrl.endDate"
- ng-change="$ctrl.onRangeInputChanged('to')"
- ng-keyup="$ctrl.handleEnterPress($event)"
- />
- </h6>
-
- <div
- id="calendarTo"
- piwik-date-picker
- view-date="$ctrl.endDate"
- selected-date-start="$ctrl.toPickerSelectedDates[0]"
- selected-date-end="$ctrl.toPickerSelectedDates[1]"
- highlighted-date-start="$ctrl.toPickerHighlightedDates[0]"
- highlighted-date-end="$ctrl.toPickerHighlightedDates[1]"
- date-select="$ctrl.setEndRangeDate(date)"
- cell-hover="$ctrl.toPickerHighlightedDates = $ctrl.getNewHighlightedDates(date, $cell)"
- cell-hover-leave="$ctrl.toPickerHighlightedDates = null"
- >
- </div>
-</div>
diff --git a/plugins/CoreHome/angularjs/date-range-picker/date-range-picker.component.js b/plugins/CoreHome/angularjs/date-range-picker/date-range-picker.component.js
deleted file mode 100644
index c436c0891b..0000000000
--- a/plugins/CoreHome/angularjs/date-range-picker/date-range-picker.component.js
+++ /dev/null
@@ -1,156 +0,0 @@
-/*!
- * Matomo - free/libre analytics platform
- *
- * @link https://matomo.org
- * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- */
-
-/**
- * Combines two jquery UI datepickers to provide a date range picker (that picks inclusive
- * ranges).
- *
- * Properties:
- * - startDate: The start of the date range. Should be a string in the YYYY-MM-DD format.
- * - endDate: The end of the date range. Should be a string in the YYYY-MM-DD format. Note:
- * date ranges are inclusive.
- * - rangeChange: Called when one or both dates bounding the range change. If the dates are
- * in an invalid state, the date will be null in this event.
- * - submit: Called if the 'enter' key is pressed in either of the inputs.
- *
- * Usage:
- * <piwik-date-range-picker>
- */
-(function () {
- angular.module('piwikApp').component('piwikDateRangePicker', {
- templateUrl: 'plugins/CoreHome/angularjs/date-range-picker/date-range-picker.component.html?cb=' + piwik.cacheBuster,
- bindings: {
- startDate: '<',
- endDate: '<',
- rangeChange: '&',
- submit: '&'
- },
- controller: DateRangePickerController
- });
-
- DateRangePickerController.$inject = ['piwikPeriods'];
-
- function DateRangePickerController(piwikPeriods) {
- var vm = this;
-
- vm.fromPickerSelectedDates = null;
- vm.toPickerSelectedDates = null;
- vm.fromPickerHighlightedDates = null;
- vm.toPickerHighlightedDates = null;
- vm.startDateInvalid = false;
- vm.endDateInvalid = false;
-
- vm.$onChanges = $onChanges;
- vm.setStartRangeDate = setStartRangeDate;
- vm.setEndRangeDate = setEndRangeDate;
- vm.onRangeInputChanged = onRangeInputChanged;
- vm.getNewHighlightedDates = getNewHighlightedDates;
- vm.handleEnterPress = handleEnterPress;
-
- function $onChanges(changes) {
- if (changes.startDate) {
- setStartRangeDateFromStr(vm.startDate);
- }
-
- if (changes.endDate) {
- setEndRangeDateFromStr(vm.endDate);
- }
- }
-
- function onRangeInputChanged(source) {
- if (source === 'from') {
- setStartRangeDateFromStr(vm.startDate);
- } else {
- setEndRangeDateFromStr(vm.endDate);
- }
- }
-
- function setStartRangeDateFromStr(dateStr) {
- vm.startDateInvalid = true;
-
- var startDateParsed;
- try {
- startDateParsed = $.datepicker.parseDate('yy-mm-dd', dateStr);
- } catch (e) {
- // ignore
- }
-
- if (startDateParsed) {
- vm.fromPickerSelectedDates = [startDateParsed, startDateParsed];
- vm.startDateInvalid = false;
- }
-
- rangeChanged();
- }
-
- function setEndRangeDateFromStr(dateStr) {
- vm.endDateInvalid = true;
-
- var endDateParsed;
- try {
- endDateParsed = $.datepicker.parseDate('yy-mm-dd', dateStr);
- } catch (e) {
- // ignore
- }
-
- if (endDateParsed) {
- vm.toPickerSelectedDates = [endDateParsed, endDateParsed];
- vm.endDateInvalid = false;
- }
-
- rangeChanged();
- }
-
- function handleEnterPress($event) {
- if ($event.keyCode !== 13 || !vm.submit) {
- return;
- }
-
- vm.submit({
- start: vm.startDate,
- end: vm.endDate
- });
- }
-
- function setStartRangeDate(date) {
- vm.startDateInvalid = false;
- vm.startDate = piwikPeriods.format(date);
-
- vm.fromPickerSelectedDates = [date, date];
-
- rangeChanged();
- }
-
- function setEndRangeDate(date) {
- vm.endDateInvalid = false;
- vm.endDate = piwikPeriods.format(date);
-
- vm.toPickerSelectedDates = [date, date];
-
- rangeChanged();
- }
-
- function rangeChanged() {
- if (!vm.rangeChange) {
- return;
- }
-
- vm.rangeChange({
- start: vm.startDateInvalid ? null : vm.startDate,
- end: vm.endDateInvalid ? null : vm.endDate
- });
- }
-
- function getNewHighlightedDates(date, $cell) {
- if ($cell.hasClass('ui-datepicker-unselectable')) {
- return null;
- }
-
- return [date, date];
- }
- }
-})();
diff --git a/plugins/CoreHome/angularjs/period-date-picker/period-date-picker.component.html b/plugins/CoreHome/angularjs/period-date-picker/period-date-picker.component.html
deleted file mode 100644
index 3730b9701e..0000000000
--- a/plugins/CoreHome/angularjs/period-date-picker/period-date-picker.component.html
+++ /dev/null
@@ -1,14 +0,0 @@
-<div
- piwik-date-picker
- selected-date-start="$ctrl.selectedDates[0]"
- selected-date-end="$ctrl.selectedDates[1]"
- highlighted-date-start="$ctrl.highlightedDates[0]"
- highlighted-date-end="$ctrl.highlightedDates[1]"
- view-date="$ctrl.viewDate"
- step-months="$ctrl.period === 'year' ? 12 : 1"
- disable-month-dropdown="$ctrl.period === 'year'"
- cell-hover="$ctrl.onHoverNormalCell(date, $cell)"
- cell-hover-leave="$ctrl.onHoverLeaveNormalCells()"
- date-select="$ctrl.onDateSelected(date)"
->
-</div> \ No newline at end of file
diff --git a/plugins/CoreHome/angularjs/period-date-picker/period-date-picker.component.js b/plugins/CoreHome/angularjs/period-date-picker/period-date-picker.component.js
deleted file mode 100644
index c03f202caf..0000000000
--- a/plugins/CoreHome/angularjs/period-date-picker/period-date-picker.component.js
+++ /dev/null
@@ -1,105 +0,0 @@
-/*!
- * Matomo - free/libre analytics platform
- *
- * @link https://matomo.org
- * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- */
-
-/**
- * Wraps a date picker to provide more intuitive date picking for periods.
- *
- * Supports all Piwik periods that have one date (so not range periods). When a user
- * hovers over a date, the entire period for the date is highlighted. The selected
- * period is colored similarly.
- *
- * Properties:
- * - period: The label of the period. 'week', 'day', etc.
- * - date: A date inside the period. Must be a Date object.
- * - select: called when a date is selected in the picker.
- *
- * Usage:
- * <piwik-period-date-picker>
- */
-(function () {
- angular.module('piwikApp').component('piwikPeriodDatePicker', {
- templateUrl: 'plugins/CoreHome/angularjs/period-date-picker/period-date-picker.component.html?cb=' + piwik.cacheBuster,
- bindings: {
- period: '<',
- date: '<',
- select: '&'
- },
- controller: PeriodDatePickerController
- });
-
- PeriodDatePickerController.$inject = ['piwikPeriods', 'piwik'];
-
- function PeriodDatePickerController(piwikPeriods, piwik) {
- var piwikMinDate = new Date(piwik.minDateYear, piwik.minDateMonth - 1, piwik.minDateDay),
- piwikMaxDate = new Date(piwik.maxDateYear, piwik.maxDateMonth - 1, piwik.maxDateDay);
-
- var vm = this;
- vm.selectedDates = [null, null];
- vm.highlightedDates = [null, null];
- vm.viewDate = null;
- vm.onHoverNormalCell = onHoverNormalCell;
- vm.onHoverLeaveNormalCells = onHoverLeaveNormalCells;
- vm.onDateSelected = onDateSelected;
- vm.$onChanges = $onChanges;
- vm.$onInit = $onInit;
-
- function onHoverNormalCell(cellDate, $cell) {
- var isOutOfMinMaxDateRange = cellDate < piwikMinDate || cellDate > piwikMaxDate;
-
- // don't highlight anything if the period is month or day, and we're hovering over calendar whitespace.
- // since there are no dates, it's doesn't make sense what you're selecting.
- var shouldNotHighlightFromWhitespace = $cell.hasClass('ui-datepicker-other-month') && (vm.period === 'month'
- || vm.period === 'day');
-
- if (isOutOfMinMaxDateRange
- || shouldNotHighlightFromWhitespace
- ) {
- vm.highlightedDates = [null, null];
- return;
- }
-
- vm.highlightedDates = getBoundedDateRange(cellDate);
- }
-
- function onHoverLeaveNormalCells() {
- vm.highlightedDates = [null, null];
- }
-
- function $onInit() {
- // vm.date is only guaranteed to be set here
- vm.viewDate = vm.date;
- }
-
- function $onChanges() {
- if (!vm.period || !vm.date) {
- vm.selectedDates = [null, null];
- return;
- }
-
- vm.selectedDates = getBoundedDateRange(vm.date);
- }
-
- function onDateSelected(date) {
- if (!vm.select) {
- return;
- }
-
- vm.select({ date: date });
- }
-
- function getBoundedDateRange(date) {
- var periodClass = piwikPeriods.get(vm.period);
- var dates = (new periodClass(date)).getDateRange();
-
- // make sure highlighted date range is within min/max date range
- dates[0] = piwikMinDate < dates[0] ? dates[0] : piwikMinDate;
- dates[1] = piwikMaxDate > dates[1] ? dates[1] : piwikMaxDate;
-
- return dates;
- }
- }
-})();
diff --git a/plugins/CoreHome/angularjs/period-date-picker/period-date-picker.component.less b/plugins/CoreHome/angularjs/period-date-picker/period-date-picker.component.less
deleted file mode 100644
index 5c05e5a0cc..0000000000
--- a/plugins/CoreHome/angularjs/period-date-picker/period-date-picker.component.less
+++ /dev/null
@@ -1,3 +0,0 @@
-piwik-period-date-picker {
- display: block;
-} \ No newline at end of file
diff --git a/plugins/CoreHome/angularjs/period-selector/period-selector.directive.html b/plugins/CoreHome/angularjs/period-selector/period-selector.directive.html
index 518b0355d0..a93c638b5a 100644
--- a/plugins/CoreHome/angularjs/period-selector/period-selector.directive.html
+++ b/plugins/CoreHome/angularjs/period-selector/period-selector.directive.html
@@ -25,7 +25,7 @@
</piwik-date-range-picker>
<div
class="period-date"
- ng-show="periodSelector.selectedPeriod !== 'range'"
+ ng-if="periodSelector.selectedPeriod !== 'range'"
>
<piwik-period-date-picker
id="datepicker"
diff --git a/plugins/CoreHome/angularjs/selector/selector.directive.js b/plugins/CoreHome/angularjs/selector/selector.directive.js
deleted file mode 100644
index 848f174e1d..0000000000
--- a/plugins/CoreHome/angularjs/selector/selector.directive.js
+++ /dev/null
@@ -1,125 +0,0 @@
-/*!
- * Matomo - free/libre analytics platform
- *
- * @link https://matomo.org
- * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- */
-
-/**
- *
- */
-(function () {
- angular.module('piwikApp').directive('piwikExpandOnClick', piwikExpandOnClick);
-
- piwikExpandOnClick.$inject = ['$document', 'piwik'];
-
- function piwikExpandOnClick($document, piwik){
-
- return {
- restrict: 'A',
- link: function(scope, element, attr) {
-
- element.find('.title').on('click', function () {
- element.toggleClass('expanded');
-
- var $position = element.find('.dropdown.positionInViewport');
-
- if ($position.length) {
- piwik.helper.setMarginLeftToBeInViewport($position);
- }
- });
-
- var isMouseDown = false;
- var hasScrolled = false;
-
- function onClickOutsideElement (event) {
- var hadUsedScrollbar = isMouseDown && hasScrolled;
- isMouseDown = false;
- hasScrolled = false;
-
- if (hadUsedScrollbar) {
- return;
- }
-
- if (element.has(event.target).length === 0) {
- element.removeClass('expanded');
- }
- }
-
- function onScroll (event) {
- hasScrolled = true;
- }
-
- function onMouseDown (event) {
- isMouseDown = true;
- hasScrolled = false;
- }
-
- function onEscapeHandler (event) {
- if (event.which === 27) {
- isMouseDown = false;
- hasScrolled = false;
- element.removeClass('expanded');
- }
- }
-
- $document.on('keyup', onEscapeHandler);
- $document.on('mousedown', onMouseDown);
- $document.on('mouseup', onClickOutsideElement);
- $document.on('scroll', onScroll);
- scope.$on('$destroy', function() {
- $document.off('keyup', onEscapeHandler);
- $document.off('mousedown', onMouseDown);
- $document.off('mouseup', onClickOutsideElement);
- $document.off('scroll', onScroll);
- });
- }
- };
- }
-
- angular.module('piwikApp').directive('piwikExpandOnHover', piwikExpandOnHover);
-
- piwikExpandOnHover.$inject = ['$document', 'piwik'];
-
- function piwikExpandOnHover($document, piwik){
-
- return {
- restrict: 'A',
- link: function(scope, element, attr) {
-
- element.on('mouseenter', '.title', function () {
- element.addClass('expanded');
-
- var $position = element.find('.dropdown.positionInViewport');
-
- if ($position.length) {
- piwik.helper.setMarginLeftToBeInViewport($position);
- }
- });
-
- element.on('mouseleave', function () {
- element.removeClass('expanded');
- });
-
- function onClickOutsideElement (event) {
- if (element.has(event.target).length === 0) {
- element.removeClass('expanded');
- }
- }
-
- function onEscapeHandler (event) {
- if (event.which === 27) {
- element.removeClass('expanded');
- }
- }
-
- $document.on('keyup', onEscapeHandler);
- $document.on('mouseup', onClickOutsideElement);
- scope.$on('$destroy', function() {
- $document.off('mouseup', onClickOutsideElement);
- $document.off('keyup', onEscapeHandler);
- });
- }
- };
- }
-})();
diff --git a/plugins/CoreHome/angularjs/selector/selector.directive.less b/plugins/CoreHome/stylesheets/selector.less
index d7053dd45d..d7053dd45d 100644
--- a/plugins/CoreHome/angularjs/selector/selector.directive.less
+++ b/plugins/CoreHome/stylesheets/selector.less
diff --git a/plugins/CoreHome/vue/dist/CoreHome.umd.js b/plugins/CoreHome/vue/dist/CoreHome.umd.js
index cd4dcc3fd0..b82b424c68 100644
--- a/plugins/CoreHome/vue/dist/CoreHome.umd.js
+++ b/plugins/CoreHome/vue/dist/CoreHome.umd.js
@@ -147,9 +147,14 @@ __webpack_require__.d(__webpack_exports__, "getToday", function() { return /* re
__webpack_require__.d(__webpack_exports__, "parseDate", function() { return /* reexport */ parseDate; });
__webpack_require__.d(__webpack_exports__, "todayIsInRange", function() { return /* reexport */ todayIsInRange; });
__webpack_require__.d(__webpack_exports__, "MatomoDialog", function() { return /* reexport */ MatomoDialog; });
+__webpack_require__.d(__webpack_exports__, "ExpandOnClick", function() { return /* reexport */ ExpandOnClick; });
+__webpack_require__.d(__webpack_exports__, "ExpandOnHover", function() { return /* reexport */ ExpandOnHover; });
__webpack_require__.d(__webpack_exports__, "EnrichedHeadline", function() { return /* reexport */ EnrichedHeadline; });
__webpack_require__.d(__webpack_exports__, "ContentBlock", function() { return /* reexport */ ContentBlock; });
__webpack_require__.d(__webpack_exports__, "Comparisons", function() { return /* reexport */ Comparisons; });
+__webpack_require__.d(__webpack_exports__, "DatePicker", function() { return /* reexport */ DatePicker; });
+__webpack_require__.d(__webpack_exports__, "DateRangePicker", function() { return /* reexport */ DateRangePicker; });
+__webpack_require__.d(__webpack_exports__, "PeriodDatePicker", function() { return /* reexport */ PeriodDatePicker; });
// CONCATENATED MODULE: ./node_modules/@vue/cli-service/lib/commands/build/setPublicPath.js
// This file is imported into lib/wc client bundles.
@@ -1835,6 +1840,214 @@ function ajaxQueue() {
}
angular.module('piwikApp.service').service('globalAjaxQueue', ajaxQueue);
+// CONCATENATED MODULE: ./plugins/CoreHome/vue/src/ExpandOnClick/ExpandOnClick.ts
+/*!
+ * Matomo - free/libre analytics platform
+ *
+ * @link https://matomo.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+
+function onExpand(element) {
+ element.classList.toggle('expanded');
+ var positionElement = element.querySelector('.dropdown.positionInViewport');
+
+ if (positionElement) {
+ Matomo_Matomo.helper.setMarginLeftToBeInViewport(positionElement);
+ }
+}
+
+function onClickOutsideElement(element, binding, event) {
+ var hadUsedScrollbar = binding.value.isMouseDown && binding.value.hasScrolled;
+ binding.value.isMouseDown = false;
+ binding.value.hasScrolled = false;
+
+ if (hadUsedScrollbar) {
+ return;
+ }
+
+ if (!element.contains(event.target)) {
+ element.classList.remove('expanded');
+ }
+}
+
+function onScroll(binding) {
+ binding.value.hasScrolled = true;
+}
+
+function onMouseDown(binding) {
+ binding.value.isMouseDown = true;
+ binding.value.hasScrolled = false;
+}
+
+function onEscapeHandler(element, binding, event) {
+ if (event.which === 27) {
+ binding.value.isMouseDown = false;
+ binding.value.hasScrolled = false;
+ element.classList.remove('expanded');
+ }
+}
+
+var doc = document.documentElement;
+/**
+ * Usage (in a component):
+ *
+ * directives: {
+ * ExpandOnClick: ExpandOnClick(), // function call is important since we store state
+ * // in this directive
+ * }
+ */
+
+/* harmony default export */ var ExpandOnClick = ({
+ mounted: function mounted(el, binding) {
+ binding.value.isMouseDown = false;
+ binding.value.hasScrolled = false;
+ binding.value.onExpand = onExpand.bind(null, el);
+ binding.value.onEscapeHandler = onEscapeHandler.bind(null, el, binding);
+ binding.value.onMouseDown = onMouseDown.bind(null, binding);
+ binding.value.onClickOutsideElement = onClickOutsideElement.bind(null, el, binding);
+ binding.value.onScroll = onScroll.bind(null, binding);
+ binding.value.expander.addEventListener('click', binding.value.onExpand);
+ doc.addEventListener('keyup', binding.value.onEscapeHandler);
+ doc.addEventListener('mousedown', binding.value.onMouseDown);
+ doc.addEventListener('mouseup', binding.value.onClickOutsideElement);
+ doc.addEventListener('scroll', binding.value.onScroll);
+ },
+ unmounted: function unmounted(el, binding) {
+ binding.value.expander.removeEventListener('click', binding.value.onExpand);
+ doc.removeEventListener('keyup', binding.value.onEscapeHandler);
+ doc.removeEventListener('mousedown', binding.value.onMouseDown);
+ doc.removeEventListener('mouseup', binding.value.onClickOutsideElement);
+ doc.removeEventListener('scroll', binding.value.onScroll);
+ }
+});
+// CONCATENATED MODULE: ./plugins/CoreHome/vue/src/ExpandOnClick/ExpandOnClick.adapter.ts
+/*!
+ * Matomo - free/libre analytics platform
+ *
+ * @link https://matomo.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+function piwikExpandOnClick() {
+ return {
+ restrict: 'A',
+ link: function expandOnClickLink(scope, element) {
+ var binding = {
+ instance: null,
+ value: {
+ expander: element.find('.title').first()[0]
+ },
+ oldValue: null,
+ modifiers: {},
+ dir: {}
+ };
+ var wrapped = ExpandOnClick;
+ wrapped.mounted(element[0], binding);
+ element.on('$destroy', function () {
+ return wrapped.unmounted(element[0], binding);
+ });
+ }
+ };
+}
+piwikExpandOnClick.$inject = [];
+angular.module('piwikApp').directive('piwikExpandOnClick', piwikExpandOnClick);
+// CONCATENATED MODULE: ./plugins/CoreHome/vue/src/ExpandOnHover/ExpandOnHover.ts
+/*!
+ * Matomo - free/libre analytics platform
+ *
+ * @link https://matomo.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+
+function onMouseEnter(element) {
+ element.classList.add('expanded');
+ var positionElement = element.querySelector('.dropdown.positionInViewport');
+
+ if (positionElement) {
+ Matomo_Matomo.helper.setMarginLeftToBeInViewport(positionElement);
+ }
+}
+
+function onMouseLeave(element) {
+ element.classList.remove('expanded');
+}
+
+function ExpandOnHover_onClickOutsideElement(element, event) {
+ if (!element.contains(event.target)) {
+ element.classList.remove('expanded');
+ }
+}
+
+function ExpandOnHover_onEscapeHandler(element, event) {
+ if (event.which === 27) {
+ element.classList.remove('expanded');
+ }
+}
+
+var ExpandOnHover_doc = document.documentElement;
+/**
+ * Usage (in a component):
+ *
+ * directives: {
+ * ExpandOnHover: ExpandOnHover(), // function call is important since we store state
+ * // in this directive
+ * }
+ */
+
+/* harmony default export */ var ExpandOnHover = ({
+ mounted: function mounted(el, binding) {
+ binding.value.onMouseEnter = onMouseEnter.bind(null, el);
+ binding.value.onMouseLeave = onMouseLeave.bind(null, el);
+ binding.value.onClickOutsideElement = ExpandOnHover_onClickOutsideElement.bind(null, el);
+ binding.value.onEscapeHandler = ExpandOnHover_onEscapeHandler.bind(null, el);
+ binding.value.expander.addEventListener('mouseenter', binding.value.onMouseEnter);
+ el.addEventListener('mouseleave', binding.value.onMouseLeave);
+ ExpandOnHover_doc.addEventListener('keyup', binding.value.onEscapeHandler);
+ ExpandOnHover_doc.addEventListener('mouseup', binding.value.onClickOutsideElement);
+ },
+ unmounted: function unmounted(el, binding) {
+ binding.value.expander.removeEventListener('mouseenter', binding.value.onMouseEnter);
+ el.removeEventListener('mouseleave', binding.value.onMouseLeave);
+ document.removeEventListener('keyup', binding.value.onEscapeHandler);
+ document.removeEventListener('mouseup', binding.value.onClickOutsideElement);
+ }
+});
+// CONCATENATED MODULE: ./plugins/CoreHome/vue/src/ExpandOnHover/ExpandOnHover.adapter.ts
+/*!
+ * Matomo - free/libre analytics platform
+ *
+ * @link https://matomo.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+
+function piwikExpandOnHover() {
+ return {
+ restrict: 'A',
+ link: function expandOnHoverLink(scope, element) {
+ var binding = {
+ instance: null,
+ value: {
+ expander: element.find('.title').first()[0]
+ },
+ oldValue: null,
+ modifiers: {},
+ dir: {}
+ };
+ var wrapped = ExpandOnHover;
+ wrapped.mounted(element[0], binding);
+ element.on('$destroy', function () {
+ return wrapped.unmounted(element[0], binding);
+ });
+ }
+ };
+}
+
+piwikExpandOnHover.$inject = [];
+angular.module('piwikApp').directive('piwikExpandOnHover', piwikExpandOnHover);
// CONCATENATED MODULE: ./node_modules/@vue/cli-plugin-babel/node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/@vue/cli-plugin-babel/node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib!./node_modules/@vue/cli-service/node_modules/vue-loader-v16/dist/templateLoader.js??ref--6!./node_modules/@vue/cli-service/node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/@vue/cli-service/node_modules/vue-loader-v16/dist??ref--0-1!./plugins/CoreHome/vue/src/MatomoDialog/MatomoDialog.vue?vue&type=template&id=15ad69b4
var _hoisted_1 = {
@@ -1937,6 +2150,19 @@ function createAngularJsAdapter_arrayWithHoles(arr) { if (Array.isArray(arr)) re
var transcludeCounter = 0;
+
+function toKebabCase(arg) {
+ return arg.substring(0, 1).toLowerCase() + arg.substring(1).replace(/[A-Z]/g, function (s) {
+ return "-".concat(s.toLowerCase());
+ });
+}
+
+function toAngularJsCamelCase(arg) {
+ return arg.substring(0, 1).toLowerCase() + arg.substring(1).replace(/-([a-z])/g, function (s, p) {
+ return p.toUpperCase();
+ });
+}
+
function createAngularJsAdapter(options) {
var component = options.component,
_options$scope = options.scope,
@@ -1983,27 +2209,39 @@ function createAngularJsAdapter(options) {
compile: function angularJsAdapterCompile() {
return {
post: function angularJsAdapterLink(ngScope, ngElement, ngAttrs) {
- var clone = transclude ? ngElement.find("[ng-transclude][counter=".concat(currentTranscludeCounter, "]")) : null;
- var rootVueTemplate = '<root-component';
- Object.entries(scope).forEach(function (_ref3) {
- var _ref4 = createAngularJsAdapter_slicedToArray(_ref3, 2),
- info = _ref4[1];
+ var clone = transclude ? ngElement.find("[ng-transclude][counter=".concat(currentTranscludeCounter, "]")) : null; // build the root vue template
- rootVueTemplate += " :".concat(info.vue, "=\"").concat(info.vue, "\"");
- });
+ var rootVueTemplate = '<root-component';
Object.entries(events).forEach(function (info) {
var _info = createAngularJsAdapter_slicedToArray(info, 1),
eventName = _info[0];
rootVueTemplate += " @".concat(eventName, "=\"onEventHandler('").concat(eventName, "', $event)\"");
});
+ Object.entries(scope).forEach(function (_ref3) {
+ var _ref4 = createAngularJsAdapter_slicedToArray(_ref3, 2),
+ key = _ref4[0],
+ info = _ref4[1];
+
+ if (info.angularJsBind === '&') {
+ var eventName = toKebabCase(key);
+
+ if (!events[eventName]) {
+ // pass through scope & w/o a custom event handler
+ rootVueTemplate += " @".concat(eventName, "=\"onEventHandler('").concat(eventName, "', $event)\"");
+ }
+ } else {
+ rootVueTemplate += " :".concat(info.vue, "=\"").concat(info.vue, "\"");
+ }
+ });
rootVueTemplate += '>';
if (transclude) {
rootVueTemplate += '<div ref="transcludeTarget"/>';
}
- rootVueTemplate += '</root-component>';
+ rootVueTemplate += '</root-component>'; // build the vue app
+
var app = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createApp"])({
template: rootVueTemplate,
data: function data() {
@@ -2035,6 +2273,12 @@ function createAngularJsAdapter(options) {
},
methods: {
onEventHandler: function onEventHandler(name, $event) {
+ var scopePropertyName = toAngularJsCamelCase(name);
+
+ if (ngScope[scopePropertyName]) {
+ ngScope[scopePropertyName]($event);
+ }
+
if (events[name]) {
events[name].apply(events, [$event, ngScope, ngElement, ngAttrs].concat(injectedServices));
}
@@ -2043,15 +2287,17 @@ function createAngularJsAdapter(options) {
});
app.config.globalProperties.$sanitize = window.vueSanitize;
app.config.globalProperties.translate = translate;
- app.component('root-component', component);
+ app.component('root-component', component); // mount the app
+
var mountPoint = mountPointFactory ? mountPointFactory.apply(void 0, [ngScope, ngElement, ngAttrs].concat(injectedServices)) : ngElement[0];
- var vm = app.mount(mountPoint);
+ var vm = app.mount(mountPoint); // setup watches to bind between angularjs + vue
+
Object.entries(scope).forEach(function (_ref7) {
var _ref8 = createAngularJsAdapter_slicedToArray(_ref7, 2),
scopeVarName = _ref8[0],
info = _ref8[1];
- if (!info.angularJsBind) {
+ if (!info.angularJsBind || info.angularJsBind === '&') {
return;
}
@@ -3283,6 +3529,763 @@ angular.module('piwikApp.service').factory('piwikComparisonsService', Comparison
directiveName: 'piwikComparisons',
restrict: 'E'
}));
+// CONCATENATED MODULE: ./node_modules/@vue/cli-plugin-babel/node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/@vue/cli-plugin-babel/node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib!./node_modules/@vue/cli-service/node_modules/vue-loader-v16/dist/templateLoader.js??ref--6!./node_modules/@vue/cli-service/node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/@vue/cli-service/node_modules/vue-loader-v16/dist??ref--0-1!./plugins/CoreHome/vue/src/DatePicker/DatePicker.vue?vue&type=template&id=c8c462d2
+
+var DatePickervue_type_template_id_c8c462d2_hoisted_1 = {
+ ref: "root"
+};
+function DatePickervue_type_template_id_c8c462d2_render(_ctx, _cache, $props, $setup, $data, $options) {
+ return Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("div", DatePickervue_type_template_id_c8c462d2_hoisted_1, null, 512);
+}
+// CONCATENATED MODULE: ./plugins/CoreHome/vue/src/DatePicker/DatePicker.vue?vue&type=template&id=c8c462d2
+
+// CONCATENATED MODULE: ./node_modules/@vue/cli-plugin-typescript/node_modules/cache-loader/dist/cjs.js??ref--14-0!./node_modules/@vue/cli-plugin-typescript/node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib!./node_modules/@vue/cli-plugin-typescript/node_modules/ts-loader??ref--14-3!./node_modules/@vue/cli-service/node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/@vue/cli-service/node_modules/vue-loader-v16/dist??ref--0-1!./plugins/CoreHome/vue/src/DatePicker/DatePicker.vue?vue&type=script&lang=ts
+function DatePickervue_type_script_lang_ts_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
+
+function DatePickervue_type_script_lang_ts_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { DatePickervue_type_script_lang_ts_ownKeys(Object(source), true).forEach(function (key) { DatePickervue_type_script_lang_ts_defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { DatePickervue_type_script_lang_ts_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
+
+function DatePickervue_type_script_lang_ts_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
+
+
+
+
+var DEFAULT_STEP_MONTHS = 1;
+var DatePickervue_type_script_lang_ts_window = window,
+ DatePickervue_type_script_lang_ts_$ = DatePickervue_type_script_lang_ts_window.$;
+/* harmony default export */ var DatePickervue_type_script_lang_ts = (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["defineComponent"])({
+ props: {
+ selectedDateStart: Date,
+ selectedDateEnd: Date,
+ highlightedDateStart: Date,
+ highlightedDateEnd: Date,
+ viewDate: [String, Date],
+ stepMonths: Number,
+ disableMonthDropdown: Boolean,
+ options: Object
+ },
+ emits: ['cellHover', 'cellHoverLeave', 'dateSelect'],
+ setup: function setup(props, context) {
+ var root = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["ref"])(null);
+
+ function setDateCellColor($dateCell, dateValue) {
+ var $dateCellLink = $dateCell.children('a');
+
+ if (props.selectedDateStart && props.selectedDateEnd && dateValue >= props.selectedDateStart && dateValue <= props.selectedDateEnd) {
+ $dateCell.addClass('ui-datepicker-current-period');
+ } else {
+ $dateCell.removeClass('ui-datepicker-current-period');
+ }
+
+ if (props.highlightedDateStart && props.highlightedDateEnd && dateValue >= props.highlightedDateStart && dateValue <= props.highlightedDateEnd) {
+ // other-month cells don't have links, so the <td> must have the ui-state-hover class
+ var elementToAddClassTo = $dateCellLink.length ? $dateCellLink : $dateCell;
+ elementToAddClassTo.addClass('ui-state-hover');
+ } else {
+ $dateCell.removeClass('ui-state-hover');
+ $dateCellLink.removeClass('ui-state-hover');
+ }
+ }
+
+ function getCellDate($dateCell, month, year) {
+ if ($dateCell.hasClass('ui-datepicker-other-month')) {
+ return getOtherMonthDate($dateCell, month, year); // eslint-disable-line
+ }
+
+ var day = parseInt($dateCell.children('a,span').text(), 10);
+ return new Date(year, month, day);
+ }
+
+ function getOtherMonthDate($dateCell, month, year) {
+ var date;
+ var $row = $dateCell.parent();
+ var $rowCells = $row.children('td'); // if in the first row, the date cell is before the current month
+
+ if ($row.is(':first-child')) {
+ var $firstDateInMonth = $row.children('td:not(.ui-datepicker-other-month)').first();
+ date = getCellDate($firstDateInMonth, month, year);
+ date.setDate($rowCells.index($dateCell) - $rowCells.index($firstDateInMonth) + 1);
+ return date;
+ } // the date cell is after the current month
+
+
+ var $lastDateInMonth = $row.children('td:not(.ui-datepicker-other-month)').last();
+ date = getCellDate($lastDateInMonth, month, year);
+ date.setDate(date.getDate() + $rowCells.index($dateCell) - $rowCells.index($lastDateInMonth));
+ return date;
+ }
+
+ function getMonthYearDisplayed() {
+ var element = DatePickervue_type_script_lang_ts_$(root.value);
+ var $firstCellWithMonth = element.find('td[data-month]');
+ var month = parseInt($firstCellWithMonth.attr('data-month'), 10);
+ var year = parseInt($firstCellWithMonth.attr('data-year'), 10);
+ return [month, year];
+ }
+
+ function setDatePickerCellColors() {
+ var element = DatePickervue_type_script_lang_ts_$(root.value);
+ var $calendarTable = element.find('.ui-datepicker-calendar');
+ var monthYear = getMonthYearDisplayed(); // highlight the rest of the cells by first getting the date for the first cell
+ // in the calendar, then just incrementing by one for the rest of the cells.
+
+ var $cells = $calendarTable.find('td');
+ var $firstDateCell = $cells.first();
+ var currentDate = getCellDate($firstDateCell, monthYear[0], monthYear[1]);
+ $cells.each(function setCellColor() {
+ setDateCellColor(DatePickervue_type_script_lang_ts_$(this), currentDate);
+ currentDate.setDate(currentDate.getDate() + 1);
+ });
+ }
+
+ function viewDateChanged() {
+ var date = props.viewDate;
+
+ if (!date) {
+ return false;
+ }
+
+ if (!(date instanceof Date)) {
+ try {
+ date = parseDate(date);
+ } catch (e) {
+ return false;
+ }
+ }
+
+ var element = DatePickervue_type_script_lang_ts_$(root.value); // only change the datepicker date if the date is outside of the current month/year.
+ // this avoids a re-render in other cases.
+
+ var monthYear = getMonthYearDisplayed();
+
+ if (monthYear[0] !== date.getMonth() || monthYear[1] !== date.getFullYear()) {
+ element.datepicker('setDate', date);
+ return true;
+ }
+
+ return false;
+ } // remove the ui-state-active class & click handlers for every cell. we bypass
+ // the datepicker's date selection logic for smoother browser rendering.
+
+
+ function onJqueryUiRenderedPicker() {
+ var element = DatePickervue_type_script_lang_ts_$(root.value);
+ element.find('td[data-event]').off('click');
+ element.find('.ui-state-active').removeClass('ui-state-active');
+ element.find('.ui-datepicker-current-day').removeClass('ui-datepicker-current-day'); // add href to left/right nav in calendar so they can be accessed via keyboard
+
+ element.find('.ui-datepicker-prev,.ui-datepicker-next').attr('href', '');
+ }
+
+ function stepMonthsChanged() {
+ var element = DatePickervue_type_script_lang_ts_$(root.value);
+ var stepMonths = props.stepMonths || DEFAULT_STEP_MONTHS;
+
+ if (element.datepicker('option', 'stepMonths') === stepMonths) {
+ return false;
+ } // setting stepMonths will change the month in view back to the selected date. to avoid
+ // we set the selected date to the month in view.
+
+
+ var currentMonth = DatePickervue_type_script_lang_ts_$('.ui-datepicker-month', element).val();
+ var currentYear = DatePickervue_type_script_lang_ts_$('.ui-datepicker-year', element).val();
+ element.datepicker('option', 'stepMonths', stepMonths).datepicker('setDate', new Date(currentYear, currentMonth));
+ onJqueryUiRenderedPicker();
+ return true;
+ }
+
+ function enableDisableMonthDropdown() {
+ var element = DatePickervue_type_script_lang_ts_$(root.value);
+ element.find('.ui-datepicker-month').attr('disabled', props.disableMonthDropdown);
+ }
+
+ function handleOtherMonthClick() {
+ if (!DatePickervue_type_script_lang_ts_$(this).hasClass('ui-state-hover')) {
+ return;
+ }
+
+ var $row = DatePickervue_type_script_lang_ts_$(this).parent();
+ var $tbody = $row.parent();
+
+ if ($row.is(':first-child')) {
+ // click on first of the month
+ $tbody.find('a').first().click();
+ } else {
+ // click on last of month
+ $tbody.find('a').last().click();
+ }
+ }
+
+ function onCalendarViewChange() {
+ // clicking left/right re-enables the month dropdown, so we disable it again
+ enableDisableMonthDropdown();
+ setDatePickerCellColors();
+ } // on a prop change (NOTE: we can't watch just `props`, since then newProps and oldProps will
+ // have the same values (since it is a proxy object). Using a copy doesn't quite work, the
+ // object it returns will always be different, BUT, since we check what changes it works
+ // for our purposes. The only downside is that it runs on every tick basically, but since
+ // that is within the context of the date picker component, it's bearable.
+
+
+ Object(external_commonjs_vue_commonjs2_vue_root_Vue_["watch"])(function () {
+ return DatePickervue_type_script_lang_ts_objectSpread({}, props);
+ }, function (newProps, oldProps) {
+ var redraw = false;
+ ['selectedDateStart', 'selectedDateEnd', 'highlightedDateStart', 'highlightedDateEnd'].forEach(function (propName) {
+ if (redraw) {
+ return;
+ }
+
+ if (!newProps[propName] && oldProps[propName]) {
+ redraw = true;
+ }
+
+ if (newProps[propName] && !oldProps[propName]) {
+ redraw = true;
+ }
+
+ if (newProps[propName] && oldProps[propName] && newProps[propName].getTime() !== oldProps[propName].getTime()) {
+ redraw = true;
+ }
+ });
+
+ if (newProps.viewDate !== oldProps.viewDate && viewDateChanged()) {
+ redraw = true;
+ }
+
+ if (newProps.stepMonths !== oldProps.stepMonths) {
+ stepMonthsChanged();
+ }
+
+ if (newProps.enableDisableMonthDropdown !== oldProps.enableDisableMonthDropdown) {
+ enableDisableMonthDropdown();
+ } // redraw when selected/highlighted dates change
+
+
+ if (redraw) {
+ setDatePickerCellColors();
+ }
+ });
+ Object(external_commonjs_vue_commonjs2_vue_root_Vue_["onMounted"])(function () {
+ var element = DatePickervue_type_script_lang_ts_$(root.value);
+ var customOptions = props.options || {};
+
+ var datePickerOptions = DatePickervue_type_script_lang_ts_objectSpread(DatePickervue_type_script_lang_ts_objectSpread(DatePickervue_type_script_lang_ts_objectSpread({}, Matomo_Matomo.getBaseDatePickerOptions()), customOptions), {}, {
+ onChangeMonthYear: function onChangeMonthYear() {
+ // datepicker renders the HTML after this hook is called, so we use setTimeout
+ // to run some code after the render.
+ setTimeout(function () {
+ onJqueryUiRenderedPicker();
+ });
+ }
+ });
+
+ element.datepicker(datePickerOptions);
+ element.on('mouseover', 'tbody td a', function (event) {
+ // this event is triggered when a user clicks a date as well. in that case,
+ // the originalEvent is null. we don't need to redraw again for that, so
+ // we ignore events like that.
+ if (event.originalEvent) {
+ setDatePickerCellColors();
+ }
+ }); // on hover cell, execute scope.cellHover()
+
+ element.on('mouseenter', 'tbody td', function onMouseEnter() {
+ var monthYear = getMonthYearDisplayed();
+ var $dateCell = DatePickervue_type_script_lang_ts_$(this);
+ var dateValue = getCellDate($dateCell, monthYear[0], monthYear[1]);
+ context.emit('cellHover', {
+ date: dateValue,
+ $cell: $dateCell
+ });
+ }); // overrides jquery UI handler that unhighlights a cell when the mouse leaves it
+
+ element.on('mouseout', 'tbody td a', function () {
+ setDatePickerCellColors();
+ }); // call scope.cellHoverLeave() when mouse leaves table body (can't do event on tbody, for
+ // some reason that fails, so we do two events, one on the table & one on thead)
+
+ element.on('mouseleave', 'table', function () {
+ return context.emit('cellHoverLeave');
+ }).on('mouseenter', 'thead', function () {
+ return context.emit('cellHoverLeave');
+ }); // make sure whitespace is clickable when the period makes it appropriate
+
+ element.on('click', 'tbody td.ui-datepicker-other-month', function () {
+ return handleOtherMonthClick();
+ }); // NOTE: using a selector w/ .on() doesn't seem to work for some reason...
+
+ element.on('click', function (e) {
+ e.preventDefault();
+ var $target = DatePickervue_type_script_lang_ts_$(e.target).closest('a');
+
+ if (!$target.is('.ui-datepicker-next') && !$target.is('.ui-datepicker-prev')) {
+ return;
+ }
+
+ onCalendarViewChange();
+ }); // when a cell is clicked, invoke the onDateSelected function. this, in conjunction
+ // with onJqueryUiRenderedPicker(), overrides the date picker's click behavior.
+
+ element.on('click', 'td[data-month]', function (event) {
+ var $cell = DatePickervue_type_script_lang_ts_$(event.target).closest('td');
+ var month = parseInt($cell.attr('data-month'), 10);
+ var year = parseInt($cell.attr('data-year'), 10);
+ var day = parseInt($cell.children('a,span').text(), 10);
+ context.emit('dateSelect', {
+ date: new Date(year, month, day)
+ });
+ });
+ var renderPostProcessed = stepMonthsChanged();
+ viewDateChanged();
+ enableDisableMonthDropdown();
+
+ if (!renderPostProcessed) {
+ onJqueryUiRenderedPicker();
+ }
+
+ setDatePickerCellColors();
+ });
+ return {
+ root: root
+ };
+ }
+}));
+// CONCATENATED MODULE: ./plugins/CoreHome/vue/src/DatePicker/DatePicker.vue?vue&type=script&lang=ts
+
+// CONCATENATED MODULE: ./plugins/CoreHome/vue/src/DatePicker/DatePicker.vue
+
+
+
+DatePickervue_type_script_lang_ts.render = DatePickervue_type_template_id_c8c462d2_render
+
+/* harmony default export */ var DatePicker = (DatePickervue_type_script_lang_ts);
+// CONCATENATED MODULE: ./plugins/CoreHome/vue/src/DatePicker/DatePicker.adapter.ts
+/*!
+ * Matomo - free/libre analytics platform
+ *
+ * @link https://matomo.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+
+/* harmony default export */ var DatePicker_adapter = (createAngularJsAdapter({
+ component: DatePicker,
+ scope: {
+ selectedDateStart: {
+ angularJsBind: '<'
+ },
+ selectedDateEnd: {
+ angularJsBind: '<'
+ },
+ highlightedDateStart: {
+ angularJsBind: '<'
+ },
+ highlightedDateEnd: {
+ angularJsBind: '<'
+ },
+ viewDate: {
+ angularJsBind: '<'
+ },
+ stepMonths: {
+ angularJsBind: '<'
+ },
+ disableMonthDropdown: {
+ angularJsBind: '<'
+ },
+ options: {
+ angularJsBind: '<'
+ },
+ cellHover: {
+ angularJsBind: '&'
+ },
+ cellHoverLeave: {
+ angularJsBind: '&'
+ },
+ dateSelect: {
+ angularJsBind: '&'
+ }
+ },
+ directiveName: 'piwikDatePicker',
+ events: {
+ 'cell-hover': function cellHover(event, scope, element, attrs, $timeout) {
+ $timeout(); // trigger new digest
+ },
+ 'cell-hover-leave': function cellHoverLeave(event, scope, element, attrs, $timeout) {
+ $timeout(); // trigger new digest
+ },
+ 'date-select': function dateSelect(event, scope, element, attrs, $timeout) {
+ $timeout(); // trigger new digest
+ }
+ },
+ $inject: ['$timeout']
+}));
+// CONCATENATED MODULE: ./node_modules/@vue/cli-plugin-babel/node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/@vue/cli-plugin-babel/node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib!./node_modules/@vue/cli-service/node_modules/vue-loader-v16/dist/templateLoader.js??ref--6!./node_modules/@vue/cli-service/node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/@vue/cli-service/node_modules/vue-loader-v16/dist??ref--0-1!./plugins/CoreHome/vue/src/DateRangePicker/DateRangePicker.vue?vue&type=template&id=d9f4b538
+
+var DateRangePickervue_type_template_id_d9f4b538_hoisted_1 = {
+ id: "calendarRangeFrom"
+};
+var DateRangePickervue_type_template_id_d9f4b538_hoisted_2 = {
+ id: "calendarRangeTo"
+};
+function DateRangePickervue_type_template_id_d9f4b538_render(_ctx, _cache, $props, $setup, $data, $options) {
+ var _component_DatePicker = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["resolveComponent"])("DatePicker");
+
+ return Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])(external_commonjs_vue_commonjs2_vue_root_Vue_["Fragment"], null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", DateRangePickervue_type_template_id_d9f4b538_hoisted_1, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("h6", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createTextVNode"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_DateRangeFrom')) + " ", 1), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withDirectives"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("input", {
+ type: "text",
+ id: "inputCalendarFrom",
+ name: "inputCalendarFrom",
+ class: "browser-default",
+ "onUpdate:modelValue": _cache[0] || (_cache[0] = function ($event) {
+ return _ctx.startDateText = $event;
+ }),
+ onChange: _cache[1] || (_cache[1] = function ($event) {
+ return _ctx.onRangeInputChanged('from', $event);
+ }),
+ onKeyup: _cache[2] || (_cache[2] = function ($event) {
+ return _ctx.handleEnterPress($event);
+ })
+ }, null, 544), [[external_commonjs_vue_commonjs2_vue_root_Vue_["vModelText"], _ctx.startDateText]])]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createVNode"])(_component_DatePicker, {
+ id: "calendarFrom",
+ "view-date": _ctx.startDate,
+ "selected-date-start": _ctx.fromPickerSelectedDates[0],
+ "selected-date-end": _ctx.fromPickerSelectedDates[1],
+ "highlighted-date-start": _ctx.fromPickerHighlightedDates[0],
+ "highlighted-date-end": _ctx.fromPickerHighlightedDates[1],
+ onDateSelect: _cache[3] || (_cache[3] = function ($event) {
+ return _ctx.setStartRangeDate($event.date);
+ }),
+ onCellHover: _cache[4] || (_cache[4] = function ($event) {
+ return _ctx.fromPickerHighlightedDates = _ctx.getNewHighlightedDates($event.date, $event.$cell);
+ }),
+ onCellHoverLeave: _cache[5] || (_cache[5] = function ($event) {
+ return _ctx.fromPickerHighlightedDates = [null, null];
+ })
+ }, null, 8, ["view-date", "selected-date-start", "selected-date-end", "highlighted-date-start", "highlighted-date-end"])]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", DateRangePickervue_type_template_id_d9f4b538_hoisted_2, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("h6", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createTextVNode"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_DateRangeTo')) + " ", 1), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withDirectives"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("input", {
+ type: "text",
+ id: "inputCalendarTo",
+ name: "inputCalendarTo",
+ class: "browser-default",
+ "onUpdate:modelValue": _cache[6] || (_cache[6] = function ($event) {
+ return _ctx.endDateText = $event;
+ }),
+ onChange: _cache[7] || (_cache[7] = function ($event) {
+ return _ctx.onRangeInputChanged('to', $event);
+ }),
+ onKeyup: _cache[8] || (_cache[8] = function ($event) {
+ return _ctx.handleEnterPress($event);
+ })
+ }, null, 544), [[external_commonjs_vue_commonjs2_vue_root_Vue_["vModelText"], _ctx.endDateText]])]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createVNode"])(_component_DatePicker, {
+ id: "calendarTo",
+ "view-date": _ctx.endDate,
+ "selected-date-start": _ctx.toPickerSelectedDates[0],
+ "selected-date-end": _ctx.toPickerSelectedDates[1],
+ "highlighted-date-start": _ctx.toPickerHighlightedDates[0],
+ "highlighted-date-end": _ctx.toPickerHighlightedDates[1],
+ onDateSelect: _cache[9] || (_cache[9] = function ($event) {
+ return _ctx.setEndRangeDate($event.date);
+ }),
+ onCellHover: _cache[10] || (_cache[10] = function ($event) {
+ return _ctx.toPickerHighlightedDates = _ctx.getNewHighlightedDates($event.date, $event.$cell);
+ }),
+ onCellHoverLeave: _cache[11] || (_cache[11] = function ($event) {
+ return _ctx.toPickerHighlightedDates = [null, null];
+ })
+ }, null, 8, ["view-date", "selected-date-start", "selected-date-end", "highlighted-date-start", "highlighted-date-end"])])], 64);
+}
+// CONCATENATED MODULE: ./plugins/CoreHome/vue/src/DateRangePicker/DateRangePicker.vue?vue&type=template&id=d9f4b538
+
+// CONCATENATED MODULE: ./node_modules/@vue/cli-plugin-typescript/node_modules/cache-loader/dist/cjs.js??ref--14-0!./node_modules/@vue/cli-plugin-typescript/node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib!./node_modules/@vue/cli-plugin-typescript/node_modules/ts-loader??ref--14-3!./node_modules/@vue/cli-service/node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/@vue/cli-service/node_modules/vue-loader-v16/dist??ref--0-1!./plugins/CoreHome/vue/src/DateRangePicker/DateRangePicker.vue?vue&type=script&lang=ts
+
+
+
+/* harmony default export */ var DateRangePickervue_type_script_lang_ts = (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["defineComponent"])({
+ props: {
+ startDate: String,
+ endDate: String
+ },
+ components: {
+ DatePicker: DatePicker
+ },
+ data: function data() {
+ var startDate = null;
+
+ try {
+ startDate = parseDate(this.startDate);
+ } catch (e) {// ignore
+ }
+
+ var endDate = null;
+
+ try {
+ endDate = parseDate(this.endDate);
+ } catch (e) {// ignore
+ }
+
+ return {
+ fromPickerSelectedDates: [startDate, startDate],
+ toPickerSelectedDates: [endDate, endDate],
+ fromPickerHighlightedDates: [null, null],
+ toPickerHighlightedDates: [null, null],
+ startDateText: this.startDate,
+ endDateText: this.endDate
+ };
+ },
+ emits: ['rangeChange', 'submit'],
+ watch: {
+ startDate: function startDate() {
+ this.startDateText = this.startDate;
+ this.setStartRangeDateFromStr(this.startDate);
+ },
+ endDate: function endDate() {
+ this.endDateText = this.endDate;
+ this.setEndRangeDateFromStr(this.endDate);
+ }
+ },
+ mounted: function mounted() {
+ this.rangeChanged(); // emit with initial range pair
+ },
+ methods: {
+ setStartRangeDate: function setStartRangeDate(date) {
+ this.fromPickerSelectedDates = [date, date];
+ this.rangeChanged();
+ },
+ setEndRangeDate: function setEndRangeDate(date) {
+ this.toPickerSelectedDates = [date, date];
+ this.rangeChanged();
+ },
+ onRangeInputChanged: function onRangeInputChanged(source, event) {
+ if (source === 'from') {
+ this.setStartRangeDateFromStr(event.target.value);
+ } else {
+ this.setEndRangeDateFromStr(event.target.value);
+ }
+ },
+ getNewHighlightedDates: function getNewHighlightedDates(date, $cell) {
+ if ($cell.hasClass('ui-datepicker-unselectable')) {
+ return null;
+ }
+
+ return [date, date];
+ },
+ handleEnterPress: function handleEnterPress($event) {
+ if ($event.keyCode !== 13) {
+ return;
+ }
+
+ this.$emit('submit', {
+ start: this.startDate,
+ end: this.endDate
+ });
+ },
+ setStartRangeDateFromStr: function setStartRangeDateFromStr(dateStr) {
+ var startDateParsed;
+
+ try {
+ startDateParsed = parseDate(dateStr);
+ } catch (e) {
+ this.startDateText = this.startDate;
+ }
+
+ if (startDateParsed) {
+ this.fromPickerSelectedDates = [startDateParsed, startDateParsed];
+ }
+
+ this.rangeChanged();
+ },
+ setEndRangeDateFromStr: function setEndRangeDateFromStr(dateStr) {
+ var endDateParsed;
+
+ try {
+ endDateParsed = parseDate(dateStr);
+ } catch (e) {
+ this.endDateText = this.endDate;
+ }
+
+ if (endDateParsed) {
+ this.toPickerSelectedDates = [endDateParsed, endDateParsed];
+ }
+
+ this.rangeChanged();
+ },
+ rangeChanged: function rangeChanged() {
+ this.$emit('rangeChange', {
+ start: format(this.fromPickerSelectedDates[0]),
+ end: format(this.toPickerSelectedDates[0])
+ });
+ }
+ }
+}));
+// CONCATENATED MODULE: ./plugins/CoreHome/vue/src/DateRangePicker/DateRangePicker.vue?vue&type=script&lang=ts
+
+// CONCATENATED MODULE: ./plugins/CoreHome/vue/src/DateRangePicker/DateRangePicker.vue
+
+
+
+DateRangePickervue_type_script_lang_ts.render = DateRangePickervue_type_template_id_d9f4b538_render
+
+/* harmony default export */ var DateRangePicker = (DateRangePickervue_type_script_lang_ts);
+// CONCATENATED MODULE: ./plugins/CoreHome/vue/src/DateRangePicker/DateRangePicker.adapter.ts
+/*!
+ * Matomo - free/libre analytics platform
+ *
+ * @link https://matomo.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+
+/* harmony default export */ var DateRangePicker_adapter = (createAngularJsAdapter({
+ component: DateRangePicker,
+ scope: {
+ startDate: {
+ angularJsBind: '<'
+ },
+ endDate: {
+ angularJsBind: '<'
+ },
+ rangeChange: {
+ angularJsBind: '&'
+ },
+ submit: {
+ angularJsBind: '&'
+ }
+ },
+ directiveName: 'piwikDateRangePicker',
+ restrict: 'E'
+}));
+// CONCATENATED MODULE: ./node_modules/@vue/cli-plugin-babel/node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/@vue/cli-plugin-babel/node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib!./node_modules/@vue/cli-service/node_modules/vue-loader-v16/dist/templateLoader.js??ref--6!./node_modules/@vue/cli-service/node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/@vue/cli-service/node_modules/vue-loader-v16/dist??ref--0-1!./plugins/CoreHome/vue/src/PeriodDatePicker/PeriodDatePicker.vue?vue&type=template&id=0fe3c4e7
+
+function PeriodDatePickervue_type_template_id_0fe3c4e7_render(_ctx, _cache, $props, $setup, $data, $options) {
+ var _component_DatePicker = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["resolveComponent"])("DatePicker");
+
+ return Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createBlock"])(_component_DatePicker, {
+ "selected-date-start": _ctx.selectedDates[0],
+ "selected-date-end": _ctx.selectedDates[1],
+ "highlighted-date-start": _ctx.highlightedDates[0],
+ "highlighted-date-end": _ctx.highlightedDates[1],
+ "view-date": _ctx.viewDate,
+ "step-months": _ctx.period === 'year' ? 12 : 1,
+ "disable-month-dropdown": _ctx.period === 'year',
+ onCellHover: _cache[0] || (_cache[0] = function ($event) {
+ return _ctx.onHoverNormalCell($event.date, $event.$cell);
+ }),
+ onCellHoverLeave: _cache[1] || (_cache[1] = function ($event) {
+ return _ctx.onHoverLeaveNormalCells();
+ }),
+ onDateSelect: _cache[2] || (_cache[2] = function ($event) {
+ return _ctx.onDateSelected($event.date);
+ })
+ }, null, 8, ["selected-date-start", "selected-date-end", "highlighted-date-start", "highlighted-date-end", "view-date", "step-months", "disable-month-dropdown"]);
+}
+// CONCATENATED MODULE: ./plugins/CoreHome/vue/src/PeriodDatePicker/PeriodDatePicker.vue?vue&type=template&id=0fe3c4e7
+
+// CONCATENATED MODULE: ./node_modules/@vue/cli-plugin-typescript/node_modules/cache-loader/dist/cjs.js??ref--14-0!./node_modules/@vue/cli-plugin-typescript/node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib!./node_modules/@vue/cli-plugin-typescript/node_modules/ts-loader??ref--14-3!./node_modules/@vue/cli-service/node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/@vue/cli-service/node_modules/vue-loader-v16/dist??ref--0-1!./plugins/CoreHome/vue/src/PeriodDatePicker/PeriodDatePicker.vue?vue&type=script&lang=ts
+
+
+
+
+var piwikMinDate = new Date(Matomo_Matomo.minDateYear, Matomo_Matomo.minDateMonth - 1, Matomo_Matomo.minDateDay);
+var piwikMaxDate = new Date(Matomo_Matomo.maxDateYear, Matomo_Matomo.maxDateMonth - 1, Matomo_Matomo.maxDateDay);
+/* harmony default export */ var PeriodDatePickervue_type_script_lang_ts = (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["defineComponent"])({
+ props: {
+ period: String,
+ date: [String, Date]
+ },
+ components: {
+ DatePicker: DatePicker
+ },
+ emits: ['select'],
+ setup: function setup(props, context) {
+ var viewDate = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["ref"])(props.date);
+ var selectedDates = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["ref"])([null, null]);
+ var highlightedDates = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["ref"])([null, null]);
+
+ function getBoundedDateRange(date) {
+ var dates = Periods_Periods.get(props.period).parse(date).getDateRange(); // make sure highlighted date range is within min/max date range
+
+ dates[0] = piwikMinDate < dates[0] ? dates[0] : piwikMinDate;
+ dates[1] = piwikMaxDate > dates[1] ? dates[1] : piwikMaxDate;
+ return dates;
+ }
+
+ function onHoverNormalCell(cellDate, $cell) {
+ var isOutOfMinMaxDateRange = cellDate < piwikMinDate || cellDate > piwikMaxDate; // don't highlight anything if the period is month or day, and we're hovering over calendar
+ // whitespace. since there are no dates, it's doesn't make sense what you're selecting.
+
+ var shouldNotHighlightFromWhitespace = $cell.hasClass('ui-datepicker-other-month') && (props.period === 'month' || props.period === 'day');
+
+ if (isOutOfMinMaxDateRange || shouldNotHighlightFromWhitespace) {
+ highlightedDates.value = [null, null];
+ return;
+ }
+
+ highlightedDates.value = getBoundedDateRange(cellDate);
+ }
+
+ function onHoverLeaveNormalCells() {
+ highlightedDates.value = [null, null];
+ }
+
+ function onDateSelected(date) {
+ context.emit('select', {
+ date: date
+ });
+ }
+
+ function onChanges() {
+ if (!props.period || !props.date) {
+ selectedDates.value = [null, null];
+ return;
+ }
+
+ selectedDates.value = getBoundedDateRange(props.date);
+ }
+
+ Object(external_commonjs_vue_commonjs2_vue_root_Vue_["watch"])(props, onChanges);
+ onChanges();
+ return {
+ selectedDates: selectedDates,
+ highlightedDates: highlightedDates,
+ viewDate: viewDate,
+ onHoverNormalCell: onHoverNormalCell,
+ onHoverLeaveNormalCells: onHoverLeaveNormalCells,
+ onDateSelected: onDateSelected
+ };
+ }
+}));
+// CONCATENATED MODULE: ./plugins/CoreHome/vue/src/PeriodDatePicker/PeriodDatePicker.vue?vue&type=script&lang=ts
+
+// CONCATENATED MODULE: ./plugins/CoreHome/vue/src/PeriodDatePicker/PeriodDatePicker.vue
+
+
+
+PeriodDatePickervue_type_script_lang_ts.render = PeriodDatePickervue_type_template_id_0fe3c4e7_render
+
+/* harmony default export */ var PeriodDatePicker = (PeriodDatePickervue_type_script_lang_ts);
+// CONCATENATED MODULE: ./plugins/CoreHome/vue/src/PeriodDatePicker/PeriodDatePicker.adapter.ts
+/*!
+ * Matomo - free/libre analytics platform
+ *
+ * @link https://matomo.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+
+/* harmony default export */ var PeriodDatePicker_adapter = (createAngularJsAdapter({
+ component: PeriodDatePicker,
+ scope: {
+ period: {
+ angularJsBind: '<'
+ },
+ date: {
+ angularJsBind: '<'
+ },
+ select: {
+ angularJsBind: '&'
+ }
+ },
+ directiveName: 'piwikPeriodDatePicker',
+ restrict: 'E'
+}));
// CONCATENATED MODULE: ./node_modules/@vue/cli-plugin-babel/node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/@vue/cli-plugin-babel/node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib!./node_modules/@vue/cli-service/node_modules/vue-loader-v16/dist/templateLoader.js??ref--6!./node_modules/@vue/cli-service/node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/@vue/cli-service/node_modules/vue-loader-v16/dist??ref--0-1!./plugins/CoreHome/vue/src/ActivityIndicator/ActivityIndicator.vue?vue&type=template&id=6af4d064
var ActivityIndicatorvue_type_template_id_6af4d064_hoisted_1 = {
@@ -3437,6 +4440,16 @@ Alertvue_type_script_lang_ts.render = Alertvue_type_template_id_c3863ae2_render
+
+
+
+
+
+
+
+
+
+
// CONCATENATED MODULE: ./node_modules/@vue/cli-service/lib/commands/build/entry-lib-no-default.js
diff --git a/plugins/CoreHome/vue/dist/CoreHome.umd.min.js b/plugins/CoreHome/vue/dist/CoreHome.umd.min.js
index 1f6be602dd..2ed5626cb3 100644
--- a/plugins/CoreHome/vue/dist/CoreHome.umd.min.js
+++ b/plugins/CoreHome/vue/dist/CoreHome.umd.min.js
@@ -4,150 +4,196 @@
*
* @link https://matomo.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- */window.hasBlockedContent=!1},"8bbf":function(t,n){t.exports=e},fae3:function(e,t,n){"use strict";if(n.r(t),n.d(t,"createAngularJsAdapter",(function(){return Le})),n.d(t,"activityIndicatorAdapter",(function(){return un})),n.d(t,"ActivityIndicator",(function(){return ln})),n.d(t,"translate",(function(){return C})),n.d(t,"alertAdapter",(function(){return gn})),n.d(t,"AjaxHelper",(function(){return Ae})),n.d(t,"MatomoUrl",(function(){return ke})),n.d(t,"Matomo",(function(){return P})),n.d(t,"Periods",(function(){return p})),n.d(t,"Day",(function(){return J})),n.d(t,"Week",(function(){return K})),n.d(t,"Month",(function(){return re})),n.d(t,"Year",(function(){return ce})),n.d(t,"Range",(function(){return V})),n.d(t,"format",(function(){return S})),n.d(t,"getToday",(function(){return D})),n.d(t,"parseDate",(function(){return E})),n.d(t,"todayIsInRange",(function(){return T})),n.d(t,"MatomoDialog",(function(){return Be})),n.d(t,"EnrichedHeadline",(function(){return ct})),n.d(t,"ContentBlock",(function(){return vt})),n.d(t,"Comparisons",(function(){return nn})),"undefined"!==typeof window){var r=window.document.currentScript,a=r&&r.src.match(/(.+\/)[^/]+\.js(\?.*)?$/);a&&(n.p=a[1])}n("2342");var o=n("8bbf");function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function s(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function c(e,t,n){return t&&s(e.prototype,t),n&&s(e,n),e}function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}
+ */window.hasBlockedContent=!1},"8bbf":function(t,n){t.exports=e},fae3:function(e,t,n){"use strict";if(n.r(t),n.d(t,"createAngularJsAdapter",(function(){return st})),n.d(t,"activityIndicatorAdapter",(function(){return Qn})),n.d(t,"ActivityIndicator",(function(){return Gn})),n.d(t,"translate",(function(){return P})),n.d(t,"alertAdapter",(function(){return Xn})),n.d(t,"AjaxHelper",(function(){return He})),n.d(t,"MatomoUrl",(function(){return ke})),n.d(t,"Matomo",(function(){return j})),n.d(t,"Periods",(function(){return p})),n.d(t,"Day",(function(){return Q})),n.d(t,"Week",(function(){return X})),n.d(t,"Month",(function(){return re})),n.d(t,"Year",(function(){return se})),n.d(t,"Range",(function(){return L})),n.d(t,"format",(function(){return C})),n.d(t,"getToday",(function(){return S})),n.d(t,"parseDate",(function(){return E})),n.d(t,"todayIsInRange",(function(){return T})),n.d(t,"MatomoDialog",(function(){return Xe})),n.d(t,"ExpandOnClick",(function(){return Ve})),n.d(t,"ExpandOnHover",(function(){return Qe})),n.d(t,"EnrichedHeadline",(function(){return Pt})),n.d(t,"ContentBlock",(function(){return $t})),n.d(t,"Comparisons",(function(){return wn})),n.d(t,"DatePicker",(function(){return In})),n.d(t,"DateRangePicker",(function(){return Nn})),n.d(t,"PeriodDatePicker",(function(){return Ln})),"undefined"!==typeof window){var r=window.document.currentScript,a=r&&r.src.match(/(.+\/)[^/]+\.js(\?.*)?$/);a&&(n.p=a[1])}n("2342");var o=n("8bbf");function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function l(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function s(e,t,n){return t&&l(e.prototype,t),n&&l(e,n),e}function c(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}
/*!
* Matomo - free/libre analytics platform
*
* @link https://matomo.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- */var u,d=function(){function e(){i(this,e),l(this,"periods",{}),l(this,"periodOrder",[])}return c(e,[{key:"addCustomPeriod",value:function(e,t){if(this.periods[e])throw new Error('The "'.concat(e,'" period already exists! It cannot be overridden.'));this.periods[e]=t,this.periodOrder.push(e)}},{key:"getAllLabels",value:function(){return Array().concat(this.periodOrder)}},{key:"get",value:function(e){var t=this.periods[e];if(!t)throw new Error("Invalid period label: ".concat(e));return t}},{key:"parse",value:function(e,t){return this.get(e).parse(t)}},{key:"isRecognizedPeriod",value:function(e){return!!this.periods[e]}}]),e}(),p=new d;function f(e){return v(e)||h(e)||g(e)||m()}function m(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function g(e,t){if(e){if("string"===typeof e)return b(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?b(e,t):void 0}}function h(e){if("undefined"!==typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}function v(e){if(Array.isArray(e))return b(e)}function b(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}
+ */var u,d=function(){function e(){i(this,e),c(this,"periods",{}),c(this,"periodOrder",[])}return s(e,[{key:"addCustomPeriod",value:function(e,t){if(this.periods[e])throw new Error('The "'.concat(e,'" period already exists! It cannot be overridden.'));this.periods[e]=t,this.periodOrder.push(e)}},{key:"getAllLabels",value:function(){return Array().concat(this.periodOrder)}},{key:"get",value:function(e){var t=this.periods[e];if(!t)throw new Error("Invalid period label: ".concat(e));return t}},{key:"parse",value:function(e,t){return this.get(e).parse(t)}},{key:"isRecognizedPeriod",value:function(e){return!!this.periods[e]}}]),e}(),p=new d;function f(e){return v(e)||g(e)||h(e)||m()}function m(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function h(e,t){if(e){if("string"===typeof e)return b(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?b(e,t):void 0}}function g(e){if("undefined"!==typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}function v(e){if(Array.isArray(e))return b(e)}function b(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}
/*!
* Matomo - free/libre analytics platform
*
* @link https://matomo.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- */var y=window,w=y.piwik,k=y.broadcast,O=y.piwikHelper;w.helper=O,w.broadcast=k,w.updateDateInTitle=function(e,t){if($(".top_controls #periodString").length&&(u=u||document.title,0===u.indexOf(w.siteName))){var n=" - ".concat(p.parse(t,e).getPrettyString()," ");document.title="".concat(w.siteName).concat(n).concat(u.substr(w.siteName.length))}},w.hasUserCapability=function(e){return window.angular.isArray(w.userCapabilities)&&-1!==w.userCapabilities.indexOf(e)},w.on=function(e,t){function n(e){t.apply(void 0,f(e.detail))}t.wrapper=n,window.addEventListener(e,n)},w.off=function(e,t){t.wrapper&&window.removeEventListener(e,t.wrapper)},w.postEventNoEmit=function(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];var a=new CustomEvent(e,{detail:n});window.dispatchEvent(a)},w.postEvent=function(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];w.postEventNoEmit.apply(w,[e].concat(n));var a=w.helper.getAngularDependency("$rootScope");return a.$oldEmit.apply(a,[e].concat(n))};var j=w,P=j;
+ */var y=window,w=y.piwik,k=y.broadcast,D=y.piwikHelper;w.helper=D,w.broadcast=k,w.updateDateInTitle=function(e,t){if($(".top_controls #periodString").length&&(u=u||document.title,0===u.indexOf(w.siteName))){var n=" - ".concat(p.parse(t,e).getPrettyString()," ");document.title="".concat(w.siteName).concat(n).concat(u.substr(w.siteName.length))}},w.hasUserCapability=function(e){return window.angular.isArray(w.userCapabilities)&&-1!==w.userCapabilities.indexOf(e)},w.on=function(e,t){function n(e){t.apply(void 0,f(e.detail))}t.wrapper=n,window.addEventListener(e,n)},w.off=function(e,t){t.wrapper&&window.removeEventListener(e,t.wrapper)},w.postEventNoEmit=function(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];var a=new CustomEvent(e,{detail:n});window.dispatchEvent(a)},w.postEvent=function(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];w.postEventNoEmit.apply(w,[e].concat(n));var a=w.helper.getAngularDependency("$rootScope");return a.$oldEmit.apply(a,[e].concat(n))};var O=w,j=O;
/*!
* Matomo - free/libre analytics platform
*
* @link https://matomo.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
-function C(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];var a=n;return 1===n.length&&n[0]&&n[0]instanceof Array&&(a=n[0]),window._pk_translate(e,a)}
+function P(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];var a=n;return 1===n.length&&n[0]&&n[0]instanceof Array&&(a=n[0]),window._pk_translate(e,a)}
/*!
* Matomo - free/libre analytics platform
*
* @link https://matomo.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- */function S(e){return $.datepicker.formatDate("yy-mm-dd",e)}function D(){var e=new Date(Date.now());return e.setTime(e.getTime()+60*e.getTimezoneOffset()*1e3),e.setHours(e.getHours()+(window.piwik.timezoneOffset||0)/3600),e.setHours(0),e.setMinutes(0),e.setSeconds(0),e.setMilliseconds(0),e}function E(e){if(e instanceof Date)return e;var t=decodeURIComponent(e).trim();if(""===t)throw new Error("Invalid date, empty string.");if("today"===t||"now"===t)return D();if("yesterday"===t||"yesterdaySameTime"===t){var n=D();return n.setDate(n.getDate()-1),n}if(t.match(/last[ -]?week/i)){var r=D();return r.setDate(r.getDate()-7),r}if(t.match(/last[ -]?month/i)){var a=D();return a.setDate(1),a.setMonth(a.getMonth()-1),a}if(t.match(/last[ -]?year/i)){var o=D();return o.setFullYear(o.getFullYear()-1),o}return $.datepicker.parseDate("yy-mm-dd",t)}function T(e){return 2===e.length&&(D()>=e[0]&&D()<=e[1])}function I(e,t){return F(e)||N(e,t)||A(e,t)||x()}function x(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function A(e,t){if(e){if("string"===typeof e)return H(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?H(e,t):void 0}}function H(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function N(e,t){var n=null==e?null:"undefined"!==typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,a,o=[],i=!0,s=!1;try{for(n=n.call(e);!(i=(r=n.next()).done);i=!0)if(o.push(r.value),t&&o.length===t)break}catch(c){s=!0,a=c}finally{try{i||null==n["return"]||n["return"]()}finally{if(s)throw a}}return o}}function F(e){if(Array.isArray(e))return e}function B(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function U(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function R(e,t,n){return t&&U(e.prototype,t),n&&U(e,n),e}function _(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}
+ */function C(e){return $.datepicker.formatDate("yy-mm-dd",e)}function S(){var e=new Date(Date.now());return e.setTime(e.getTime()+60*e.getTimezoneOffset()*1e3),e.setHours(e.getHours()+(window.piwik.timezoneOffset||0)/3600),e.setHours(0),e.setMinutes(0),e.setSeconds(0),e.setMilliseconds(0),e}function E(e){if(e instanceof Date)return e;var t=decodeURIComponent(e).trim();if(""===t)throw new Error("Invalid date, empty string.");if("today"===t||"now"===t)return S();if("yesterday"===t||"yesterdaySameTime"===t){var n=S();return n.setDate(n.getDate()-1),n}if(t.match(/last[ -]?week/i)){var r=S();return r.setDate(r.getDate()-7),r}if(t.match(/last[ -]?month/i)){var a=S();return a.setDate(1),a.setMonth(a.getMonth()-1),a}if(t.match(/last[ -]?year/i)){var o=S();return o.setFullYear(o.getFullYear()-1),o}return $.datepicker.parseDate("yy-mm-dd",t)}function T(e){return 2===e.length&&(S()>=e[0]&&S()<=e[1])}function x(e,t){return N(e)||B(e,t)||H(e,t)||I()}function I(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function H(e,t){if(e){if("string"===typeof e)return A(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?A(e,t):void 0}}function A(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function B(e,t){var n=null==e?null:"undefined"!==typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,a,o=[],i=!0,l=!1;try{for(n=n.call(e);!(i=(r=n.next()).done);i=!0)if(o.push(r.value),t&&o.length===t)break}catch(s){l=!0,a=s}finally{try{i||null==n["return"]||n["return"]()}finally{if(l)throw a}}return o}}function N(e){if(Array.isArray(e))return e}function M(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function F(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function R(e,t,n){return t&&F(e.prototype,t),n&&F(e,n),e}function V(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}
/*!
* Matomo - free/libre analytics platform
*
* @link https://matomo.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- */var V=function(){function e(t,n,r){B(this,e),_(this,"startDate",void 0),_(this,"endDate",void 0),_(this,"childPeriodType",void 0),this.startDate=t,this.endDate=n,this.childPeriodType=r}return R(e,[{key:"getPrettyString",value:function(){var e=S(this.startDate),t=S(this.endDate);return C("General_DateRangeFromTo",[e,t])}},{key:"getDateRange",value:function(){return[this.startDate,this.endDate]}},{key:"containsToday",value:function(){return T(this.getDateRange())}}],[{key:"getLastNRange",value:function(t,n,r){var a=Math.max(parseInt(n.toString(),10)-1,0);if(Number.isNaN(a))throw new Error("Invalid range strAmount");var o=r?E(r):D(),i=new Date(o.getTime());if("day"===t)i.setDate(i.getDate()-a);else if("week"===t)i.setDate(i.getDate()-7*a);else if("month"===t)i.setDate(1),i.setMonth(i.getMonth()-a);else{if("year"!==t)throw new Error("Unknown period type '".concat(t,"'."));i.setFullYear(i.getFullYear()-a)}if("day"!==t){var s=p.periods[t].parse(i),c=p.periods[t].parse(o),l=s.getDateRange(),u=I(l,1);i=u[0];var d=c.getDateRange(),f=I(d,2);o=f[1]}var m=new Date(1991,7,6);if(i.getTime()-m.getTime()<0)switch(t){case"year":i=new Date(1992,0,1);break;case"month":i=new Date(1991,8,1);break;case"week":i=new Date(1991,8,12);break;case"day":default:i=m;break}return new e(i,o,t)}},{key:"getLastNRangeChild",value:function(t,n,r){var a=n?E(n):D(),o=new Date(a.getTime()),i=new Date(a.getTime());if("day"===t)o.setDate(o.getDate()-r),i.setDate(i.getDate()-r);else if("week"===t)o.setDate(o.getDate()-7*r),i.setDate(i.getDate()-7*r);else if("month"===t)o.setDate(1),o.setMonth(o.getMonth()-r),i.setDate(1),i.setMonth(i.getMonth()-r);else{if("year"!==t)throw new Error("Unknown period type '".concat(t,"'."));o.setFullYear(o.getFullYear()-r),i.setFullYear(i.getFullYear()-r)}if("day"!==t){var s=p.periods[t].parse(o),c=p.periods[t].parse(i),l=s.getDateRange(),u=I(l,1);o=u[0];var d=c.getDateRange(),f=I(d,2);i=f[1]}var m=new Date(1991,7,6);if(o.getTime()-m.getTime()<0)switch(t){case"year":o=new Date(1992,0,1);break;case"month":o=new Date(1991,8,1);break;case"week":o=new Date(1991,8,12);break;case"day":default:o=m;break}return new e(o,i,t)}},{key:"parse",value:function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"day";if(/^previous/.test(t)){var r=e.getLastNRange(n,"2").startDate;return e.getLastNRange(n,t.substring(8),r)}if(/^last/.test(t))return e.getLastNRange(n,t.substring(4));var a=decodeURIComponent(t).split(",");return new e(E(a[0]),E(a[1]),n)}},{key:"getDisplayText",value:function(){return C("General_DateRangeInPeriodList")}}]),e}();function M(){return{getAllLabels:p.getAllLabels.bind(p),isRecognizedPeriod:p.isRecognizedPeriod.bind(p),get:p.get.bind(p),parse:p.parse.bind(p),parseDate:E,format:S,RangePeriod:V,todayIsInRange:T}}function q(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function G(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function L(e,t,n){return t&&G(e.prototype,t),n&&G(e,n),e}function Q(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}
+ */var L=function(){function e(t,n,r){M(this,e),V(this,"startDate",void 0),V(this,"endDate",void 0),V(this,"childPeriodType",void 0),this.startDate=t,this.endDate=n,this.childPeriodType=r}return R(e,[{key:"getPrettyString",value:function(){var e=C(this.startDate),t=C(this.endDate);return P("General_DateRangeFromTo",[e,t])}},{key:"getDateRange",value:function(){return[this.startDate,this.endDate]}},{key:"containsToday",value:function(){return T(this.getDateRange())}}],[{key:"getLastNRange",value:function(t,n,r){var a=Math.max(parseInt(n.toString(),10)-1,0);if(Number.isNaN(a))throw new Error("Invalid range strAmount");var o=r?E(r):S(),i=new Date(o.getTime());if("day"===t)i.setDate(i.getDate()-a);else if("week"===t)i.setDate(i.getDate()-7*a);else if("month"===t)i.setDate(1),i.setMonth(i.getMonth()-a);else{if("year"!==t)throw new Error("Unknown period type '".concat(t,"'."));i.setFullYear(i.getFullYear()-a)}if("day"!==t){var l=p.periods[t].parse(i),s=p.periods[t].parse(o),c=l.getDateRange(),u=x(c,1);i=u[0];var d=s.getDateRange(),f=x(d,2);o=f[1]}var m=new Date(1991,7,6);if(i.getTime()-m.getTime()<0)switch(t){case"year":i=new Date(1992,0,1);break;case"month":i=new Date(1991,8,1);break;case"week":i=new Date(1991,8,12);break;case"day":default:i=m;break}return new e(i,o,t)}},{key:"getLastNRangeChild",value:function(t,n,r){var a=n?E(n):S(),o=new Date(a.getTime()),i=new Date(a.getTime());if("day"===t)o.setDate(o.getDate()-r),i.setDate(i.getDate()-r);else if("week"===t)o.setDate(o.getDate()-7*r),i.setDate(i.getDate()-7*r);else if("month"===t)o.setDate(1),o.setMonth(o.getMonth()-r),i.setDate(1),i.setMonth(i.getMonth()-r);else{if("year"!==t)throw new Error("Unknown period type '".concat(t,"'."));o.setFullYear(o.getFullYear()-r),i.setFullYear(i.getFullYear()-r)}if("day"!==t){var l=p.periods[t].parse(o),s=p.periods[t].parse(i),c=l.getDateRange(),u=x(c,1);o=u[0];var d=s.getDateRange(),f=x(d,2);i=f[1]}var m=new Date(1991,7,6);if(o.getTime()-m.getTime()<0)switch(t){case"year":o=new Date(1992,0,1);break;case"month":o=new Date(1991,8,1);break;case"week":o=new Date(1991,8,12);break;case"day":default:o=m;break}return new e(o,i,t)}},{key:"parse",value:function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"day";if(/^previous/.test(t)){var r=e.getLastNRange(n,"2").startDate;return e.getLastNRange(n,t.substring(8),r)}if(/^last/.test(t))return e.getLastNRange(n,t.substring(4));var a=decodeURIComponent(t).split(",");return new e(E(a[0]),E(a[1]),n)}},{key:"getDisplayText",value:function(){return P("General_DateRangeInPeriodList")}}]),e}();function U(){return{getAllLabels:p.getAllLabels.bind(p),isRecognizedPeriod:p.isRecognizedPeriod.bind(p),get:p.get.bind(p),parse:p.parse.bind(p),parseDate:E,format:C,RangePeriod:L,todayIsInRange:T}}function _(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function J(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function q(e,t,n){return t&&J(e.prototype,t),n&&J(e,n),e}function G(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}
/*!
* Matomo - free/libre analytics platform
*
* @link https://matomo.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- */p.addCustomPeriod("range",V),
+ */p.addCustomPeriod("range",L),
/*!
* Matomo - free/libre analytics platform
*
* @link https://matomo.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
-window.piwik.addCustomPeriod=p.addCustomPeriod.bind(p),window.angular.module("piwikApp.service").factory("piwikPeriods",M);var J=function(){function e(t){q(this,e),Q(this,"dateInPeriod",void 0),this.dateInPeriod=t}return L(e,[{key:"getPrettyString",value:function(){return S(this.dateInPeriod)}},{key:"getDateRange",value:function(){return[new Date(this.dateInPeriod.getTime()),new Date(this.dateInPeriod.getTime())]}},{key:"containsToday",value:function(){return T(this.getDateRange())}}],[{key:"parse",value:function(t){return new e(E(t))}},{key:"getDisplayText",value:function(){return C("Intl_PeriodDay")}}]),e}();function z(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function Y(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function W(e,t,n){return t&&Y(e.prototype,t),n&&Y(e,n),e}function X(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}
+window.piwik.addCustomPeriod=p.addCustomPeriod.bind(p),window.angular.module("piwikApp.service").factory("piwikPeriods",U);var Q=function(){function e(t){_(this,e),G(this,"dateInPeriod",void 0),this.dateInPeriod=t}return q(e,[{key:"getPrettyString",value:function(){return C(this.dateInPeriod)}},{key:"getDateRange",value:function(){return[new Date(this.dateInPeriod.getTime()),new Date(this.dateInPeriod.getTime())]}},{key:"containsToday",value:function(){return T(this.getDateRange())}}],[{key:"parse",value:function(t){return new e(E(t))}},{key:"getDisplayText",value:function(){return P("Intl_PeriodDay")}}]),e}();function z(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function Y(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function W(e,t,n){return t&&Y(e.prototype,t),n&&Y(e,n),e}function K(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}
/*!
* Matomo - free/libre analytics platform
*
* @link https://matomo.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- */p.addCustomPeriod("day",J);var K=function(){function e(t){z(this,e),X(this,"dateInPeriod",void 0),this.dateInPeriod=t}return W(e,[{key:"getPrettyString",value:function(){var e=this.getDateRange(),t=S(e[0]),n=S(e[1]);return C("General_DateRangeFromTo",[t,n])}},{key:"getDateRange",value:function(){var e=(this.dateInPeriod.getDay()+6)%7,t=new Date(this.dateInPeriod.getTime());t.setDate(this.dateInPeriod.getDate()-e);var n=new Date(t.getTime());return n.setDate(t.getDate()+6),[t,n]}},{key:"containsToday",value:function(){return T(this.getDateRange())}}],[{key:"parse",value:function(t){return new e(E(t))}},{key:"getDisplayText",value:function(){return C("Intl_PeriodWeek")}}]),e}();function Z(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function ee(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function te(e,t,n){return t&&ee(e.prototype,t),n&&ee(e,n),e}function ne(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}
+ */p.addCustomPeriod("day",Q);var X=function(){function e(t){z(this,e),K(this,"dateInPeriod",void 0),this.dateInPeriod=t}return W(e,[{key:"getPrettyString",value:function(){var e=this.getDateRange(),t=C(e[0]),n=C(e[1]);return P("General_DateRangeFromTo",[t,n])}},{key:"getDateRange",value:function(){var e=(this.dateInPeriod.getDay()+6)%7,t=new Date(this.dateInPeriod.getTime());t.setDate(this.dateInPeriod.getDate()-e);var n=new Date(t.getTime());return n.setDate(t.getDate()+6),[t,n]}},{key:"containsToday",value:function(){return T(this.getDateRange())}}],[{key:"parse",value:function(t){return new e(E(t))}},{key:"getDisplayText",value:function(){return P("Intl_PeriodWeek")}}]),e}();function Z(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function ee(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function te(e,t,n){return t&&ee(e.prototype,t),n&&ee(e,n),e}function ne(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}
/*!
* Matomo - free/libre analytics platform
*
* @link https://matomo.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- */p.addCustomPeriod("week",K);var re=function(){function e(t){Z(this,e),ne(this,"dateInPeriod",void 0),this.dateInPeriod=t}return te(e,[{key:"getPrettyString",value:function(){var e=C("Intl_Month_Long_StandAlone_".concat(this.dateInPeriod.getMonth()+1));return"".concat(e," ").concat(this.dateInPeriod.getFullYear())}},{key:"getDateRange",value:function(){var e=new Date(this.dateInPeriod.getTime());e.setDate(1);var t=new Date(this.dateInPeriod.getTime());return t.setDate(1),t.setMonth(t.getMonth()+1),t.setDate(0),[e,t]}},{key:"containsToday",value:function(){return T(this.getDateRange())}}],[{key:"parse",value:function(t){return new e(E(t))}},{key:"getDisplayText",value:function(){return C("Intl_PeriodMonth")}}]),e}();function ae(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function oe(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function ie(e,t,n){return t&&oe(e.prototype,t),n&&oe(e,n),e}function se(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}
+ */p.addCustomPeriod("week",X);var re=function(){function e(t){Z(this,e),ne(this,"dateInPeriod",void 0),this.dateInPeriod=t}return te(e,[{key:"getPrettyString",value:function(){var e=P("Intl_Month_Long_StandAlone_".concat(this.dateInPeriod.getMonth()+1));return"".concat(e," ").concat(this.dateInPeriod.getFullYear())}},{key:"getDateRange",value:function(){var e=new Date(this.dateInPeriod.getTime());e.setDate(1);var t=new Date(this.dateInPeriod.getTime());return t.setDate(1),t.setMonth(t.getMonth()+1),t.setDate(0),[e,t]}},{key:"containsToday",value:function(){return T(this.getDateRange())}}],[{key:"parse",value:function(t){return new e(E(t))}},{key:"getDisplayText",value:function(){return P("Intl_PeriodMonth")}}]),e}();function ae(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function oe(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function ie(e,t,n){return t&&oe(e.prototype,t),n&&oe(e,n),e}function le(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}
/*!
* Matomo - free/libre analytics platform
*
* @link https://matomo.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- */p.addCustomPeriod("month",re);var ce=function(){function e(t){ae(this,e),se(this,"dateInPeriod",void 0),this.dateInPeriod=t}return ie(e,[{key:"getPrettyString",value:function(){return this.dateInPeriod.getFullYear().toString()}},{key:"getDateRange",value:function(){var e=new Date(this.dateInPeriod.getTime());e.setMonth(0),e.setDate(1);var t=new Date(this.dateInPeriod.getTime());return t.setMonth(12),t.setDate(0),[e,t]}},{key:"containsToday",value:function(){return T(this.getDateRange())}}],[{key:"parse",value:function(t){return new e(E(t))}},{key:"getDisplayText",value:function(){return C("Intl_PeriodYear")}}]),e}();
+ */p.addCustomPeriod("month",re);var se=function(){function e(t){ae(this,e),le(this,"dateInPeriod",void 0),this.dateInPeriod=t}return ie(e,[{key:"getPrettyString",value:function(){return this.dateInPeriod.getFullYear().toString()}},{key:"getDateRange",value:function(){var e=new Date(this.dateInPeriod.getTime());e.setMonth(0),e.setDate(1);var t=new Date(this.dateInPeriod.getTime());return t.setMonth(12),t.setDate(0),[e,t]}},{key:"containsToday",value:function(){return T(this.getDateRange())}}],[{key:"parse",value:function(t){return new e(E(t))}},{key:"getDisplayText",value:function(){return P("Intl_PeriodYear")}}]),e}();
/*!
* Matomo - free/libre analytics platform
*
* @link https://matomo.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
-function le(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function ue(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?le(Object(n),!0).forEach((function(t){me(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):le(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function de(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function pe(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function fe(e,t,n){return t&&pe(e.prototype,t),n&&pe(e,n),e}function me(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}
+function ce(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function ue(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?ce(Object(n),!0).forEach((function(t){me(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):ce(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function de(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function pe(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function fe(e,t,n){return t&&pe(e.prototype,t),n&&pe(e,n),e}function me(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}
/*!
* Matomo - free/libre analytics platform
*
* @link https://matomo.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- */p.addCustomPeriod("year",ce);var ge=window,he=ge.piwik,ve=ge.broadcast;function be(e,t){try{return p.parse(e,t),!0}catch(n){return!1}}var ye=function(){function e(){var t=this;de(this,e),me(this,"urlQuery",Object(o["ref"])("")),me(this,"hashQuery",Object(o["ref"])("")),me(this,"urlParsed",Object(o["computed"])((function(){return Object(o["readonly"])(ve.getValuesFromUrl("?".concat(t.urlQuery.value),!0))}))),me(this,"hashParsed",Object(o["computed"])((function(){return Object(o["readonly"])(ve.getValuesFromUrl("?".concat(t.hashQuery.value),!0))}))),me(this,"parsed",Object(o["computed"])((function(){return Object(o["readonly"])(ue(ue({},t.urlParsed.value),t.hashParsed.value))}))),this.setUrlQuery(window.location.search),this.setHashQuery(window.location.hash),P.on("$locationChangeSuccess",(function(e){var n=new URL(e);t.setUrlQuery(n.search.replace(/^\?/,"")),t.setHashQuery(n.hash.replace(/^#/,""))})),this.updatePeriodParamsFromUrl()}return fe(e,[{key:"updateHash",value:function(e){var t="string"!==typeof e?this.stringify(e):e,n=P.helper.getAngularDependency("$location");n.search(t)}},{key:"getSearchParam",value:function(e){var t=window.location.href.split("#"),n=new RegExp("".concat(e,"(\\[]|=)"));if(t&&t[1]&&n.test(decodeURIComponent(t[1]))){var r=window.broadcast.getValueFromHash(e,window.location.href);if(r||"date"!==e&&"period"!==e&&"idSite"!==e)return r}return window.broadcast.getValueFromUrl(e,window.location.search)}},{key:"stringify",value:function(e){return $.param(e).replace(/%5B%5D/g,"[]")}},{key:"updatePeriodParamsFromUrl",value:function(){var e=this.getSearchParam("date"),t=this.getSearchParam("period");if(be(t,e)&&(he.period!==t||he.currentDateString!==e)){he.period=t;var n=p.parse(t,e).getDateRange();he.startDateString=S(n[0]),he.endDateString=S(n[1]),he.updateDateInTitle(e,t),"range"===he.period&&(e="".concat(he.startDateString,",").concat(he.endDateString)),he.currentDateString=e}}},{key:"setUrlQuery",value:function(e){this.urlQuery.value=e.replace(/^\?/,"")}},{key:"setHashQuery",value:function(e){this.hashQuery.value=e.replace(/^[#/?]+/,"")}}]),e}(),we=new ye,ke=we;
+ */p.addCustomPeriod("year",se);var he=window,ge=he.piwik,ve=he.broadcast;function be(e,t){try{return p.parse(e,t),!0}catch(n){return!1}}var ye=function(){function e(){var t=this;de(this,e),me(this,"urlQuery",Object(o["ref"])("")),me(this,"hashQuery",Object(o["ref"])("")),me(this,"urlParsed",Object(o["computed"])((function(){return Object(o["readonly"])(ve.getValuesFromUrl("?".concat(t.urlQuery.value),!0))}))),me(this,"hashParsed",Object(o["computed"])((function(){return Object(o["readonly"])(ve.getValuesFromUrl("?".concat(t.hashQuery.value),!0))}))),me(this,"parsed",Object(o["computed"])((function(){return Object(o["readonly"])(ue(ue({},t.urlParsed.value),t.hashParsed.value))}))),this.setUrlQuery(window.location.search),this.setHashQuery(window.location.hash),j.on("$locationChangeSuccess",(function(e){var n=new URL(e);t.setUrlQuery(n.search.replace(/^\?/,"")),t.setHashQuery(n.hash.replace(/^#/,""))})),this.updatePeriodParamsFromUrl()}return fe(e,[{key:"updateHash",value:function(e){var t="string"!==typeof e?this.stringify(e):e,n=j.helper.getAngularDependency("$location");n.search(t)}},{key:"getSearchParam",value:function(e){var t=window.location.href.split("#"),n=new RegExp("".concat(e,"(\\[]|=)"));if(t&&t[1]&&n.test(decodeURIComponent(t[1]))){var r=window.broadcast.getValueFromHash(e,window.location.href);if(r||"date"!==e&&"period"!==e&&"idSite"!==e)return r}return window.broadcast.getValueFromUrl(e,window.location.search)}},{key:"stringify",value:function(e){return $.param(e).replace(/%5B%5D/g,"[]")}},{key:"updatePeriodParamsFromUrl",value:function(){var e=this.getSearchParam("date"),t=this.getSearchParam("period");if(be(t,e)&&(ge.period!==t||ge.currentDateString!==e)){ge.period=t;var n=p.parse(t,e).getDateRange();ge.startDateString=C(n[0]),ge.endDateString=C(n[1]),ge.updateDateInTitle(e,t),"range"===ge.period&&(e="".concat(ge.startDateString,",").concat(ge.endDateString)),ge.currentDateString=e}}},{key:"setUrlQuery",value:function(e){this.urlQuery.value=e.replace(/^\?/,"")}},{key:"setHashQuery",value:function(e){this.hashQuery.value=e.replace(/^[#/?]+/,"")}}]),e}(),we=new ye,ke=we;
/*!
* Matomo - free/libre analytics platform
*
* @link https://matomo.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
-function Oe(){var e={getSearchParam:ke.getSearchParam.bind(ke)};return e}
+function De(){var e={getSearchParam:ke.getSearchParam.bind(ke)};return e}
/*!
* Matomo - free/libre analytics platform
*
* @link https://matomo.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
-function je(){return P}function Pe(e,t){t.$oldEmit=t.$emit,t.$emit=function(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];return P.postEvent.apply(P,[e].concat(n))},t.$oldBroadcast=t.$broadcast,t.$broadcast=function(e){for(var n=arguments.length,r=new Array(n>1?n-1:0),a=1;a<n;a++)r[a-1]=arguments[a];return P.postEventNoEmit.apply(P,[e].concat(r)),t.$oldBroadcast.apply(t,[e].concat(r))},t.$on("$locationChangeSuccess",e.updatePeriodParamsFromUrl)}function Ce(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function Se(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?Ce(Object(n),!0).forEach((function(t){Ie(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):Ce(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function De(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function Ee(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function Te(e,t,n){return t&&Ee(e.prototype,t),n&&Ee(e,n),e}function Ie(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}
+function Oe(){return j}function je(e,t){t.$oldEmit=t.$emit,t.$emit=function(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];return j.postEvent.apply(j,[e].concat(n))},t.$oldBroadcast=t.$broadcast,t.$broadcast=function(e){for(var n=arguments.length,r=new Array(n>1?n-1:0),a=1;a<n;a++)r[a-1]=arguments[a];return j.postEventNoEmit.apply(j,[e].concat(r)),t.$oldBroadcast.apply(t,[e].concat(r))},t.$on("$locationChangeSuccess",e.updatePeriodParamsFromUrl)}function Pe(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function Ce(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?Pe(Object(n),!0).forEach((function(t){xe(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):Pe(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function Se(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function Ee(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function Te(e,t,n){return t&&Ee(e.prototype,t),n&&Ee(e,n),e}function xe(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}
/*!
* Matomo - free/libre analytics platform
*
* @link https://matomo.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- */function xe(e,t){if("abort"!==t)if("undefined"!==typeof Piwik_Popover){var n=$("#loadingError");Piwik_Popover.isOpen()&&e&&500===e.status?e&&500===e.status&&$(document.body).html(piwikHelper.escape(e.responseText)):n.show()}else console.log("Request failed: ".concat(e.responseText))}he.updatePeriodParamsFromUrl=we.updatePeriodParamsFromUrl.bind(we),Oe.$inject=[],angular.module("piwikApp.service").service("piwikUrl",Oe),window.angular.module("piwikApp.service").service("piwik",je),Pe.$inject=["piwik","$rootScope"],window.angular.module("piwikApp.service").run(Pe),window.globalAjaxQueue=[],window.globalAjaxQueue.active=0,window.globalAjaxQueue.clean=function(){for(var e=this.length;e>=0;e-=1)this[e]&&4!==this[e].readyState||this.splice(e,1)},window.globalAjaxQueue.push=function(){for(var e,t=arguments.length,n=new Array(t),r=0;r<t;r++)n[r]=arguments[r];return this.active+=n.length,this.clean(),(e=Array.prototype.push).call.apply(e,[this].concat(n))},window.globalAjaxQueue.abort=function(){this.forEach((function(e){return e&&e.abort&&e.abort()})),this.splice(0,this.length),this.active=0};var Ae=function(){function e(){De(this,e),Ie(this,"format","json"),Ie(this,"timeout",null),Ie(this,"callback",null),Ie(this,"useRegularCallbackInCaseOfError",!1),Ie(this,"errorCallback",void 0),Ie(this,"withToken",!1),Ie(this,"completeCallback",void 0),Ie(this,"getParams",{}),Ie(this,"getUrl","?"),Ie(this,"postParams",{}),Ie(this,"loadingElement",null),Ie(this,"errorElement","#ajaxError"),Ie(this,"requestHandle",null),Ie(this,"defaultParams",["idSite","period","date","segment"]),this.errorCallback=xe}return Te(e,[{key:"addParams",value:function(e,t){var n=this,r="string"===typeof e?window.broadcast.getValuesFromUrl(e):e,a=["compareSegments","comparePeriods","compareDates"];Object.keys(r).forEach((function(e){var o=r[e];(-1===a.indexOf(e)||o)&&("get"===t.toLowerCase()?n.getParams[e]=o:"post"===t.toLowerCase()&&(n.postParams[e]=o))}))}},{key:"withTokenInUrl",value:function(){this.withToken=!0}},{key:"setUrl",value:function(e){this.addParams(broadcast.getValuesFromUrl(e),"GET")}},{key:"setBulkRequests",value:function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];var r=t.map((function(e){return"string"===typeof e?e:$.param(e)}));this.addParams({module:"API",method:"API.getBulkRequest",urls:r,format:"json"},"post")}},{key:"setTimeout",value:function(e){this.timeout=e}},{key:"setCallback",value:function(e){this.callback=e}},{key:"useCallbackInCaseOfError",value:function(){this.useRegularCallbackInCaseOfError=!0}},{key:"redirectOnSuccess",value:function(e){this.setCallback((function(){piwikHelper.redirect(e)}))}},{key:"setErrorCallback",value:function(e){this.errorCallback=e}},{key:"setCompleteCallback",value:function(e){this.completeCallback=e}},{key:"setFormat",value:function(e){this.format=e}},{key:"setLoadingElement",value:function(e){this.loadingElement=e||"#ajaxLoadingDiv"}},{key:"setErrorElement",value:function(e){e&&(this.errorElement=e)}},{key:"useGETDefaultParameter",value:function(e){if(e&&this.defaultParams)for(var t=0;t<this.defaultParams.length;t+=1)if(this.defaultParams[t]===e)return!0;return!1}},{key:"removeDefaultParameter",value:function(e){if(e&&this.defaultParams)for(var t=0;t<this.defaultParams.length;t+=1)this.defaultParams[t]===e&&this.defaultParams.splice(t,1)}},{key:"send",value:function(){var e=this;return $(this.errorElement).length&&$(this.errorElement).hide(),this.loadingElement&&$(this.loadingElement).fadeIn(),this.requestHandle=this.buildAjaxCall(),window.globalAjaxQueue.push(this.requestHandle),new Promise((function(t,n){e.requestHandle.then(t).fail((function(t){"abort"!==t.statusText&&(console.log("Warning: the ".concat($.param(e.getParams)," request failed!")),n(t))}))}))}},{key:"abort",value:function(){this.requestHandle&&"function"===typeof this.requestHandle.abort&&(this.requestHandle.abort(),this.requestHandle=null)}},{key:"buildAjaxCall",value:function(){var e=this,t=this,n=this.mixinDefaultGetParams(this.getParams),r=this.getUrl;"?"!==r[r.length-1]&&(r+="&"),n.segment&&(r="".concat(r,"segment=").concat(n.segment,"&"),delete n.segment),n.date&&(r="".concat(r,"date=").concat(decodeURIComponent(n.date.toString()),"&"),delete n.date),r+=$.param(n);var a={type:"POST",async:!0,url:r,dataType:this.format||"json",complete:this.completeCallback,error:function(){if(window.globalAjaxQueue.active-=1,t.errorCallback){for(var e=arguments.length,n=new Array(e),r=0;r<e;r++)n[r]=arguments[r];t.errorCallback.apply(this,n)}},success:function(t,n,r){if(e.loadingElement&&$(e.loadingElement).hide(),t&&"error"===t.result&&!e.useRegularCallbackInCaseOfError){var a=null,o="toast";if($(e.errorElement).length&&t.message&&($(e.errorElement).show(),a=e.errorElement,o=null),t.message){var i=window["require"]("piwik/UI"),s=new i.Notification;s.show(t.message,{placeat:a,context:"error",type:o,id:"ajaxHelper"}),s.scrollToNotification()}}else e.callback&&e.callback(t,n,r);window.globalAjaxQueue.active-=1,P.ajaxRequestFinished&&P.ajaxRequestFinished()},data:this.mixinDefaultPostParams(this.postParams),timeout:null!==this.timeout?this.timeout:void 0};return $.ajax(a)}},{key:"isRequestToApiMethod",value:function(){return this.getParams&&"API"===this.getParams.module&&this.getParams.method||this.postParams&&"API"===this.postParams.module&&this.postParams.method}},{key:"isWidgetizedRequest",value:function(){return"Widgetize"===broadcast.getValueFromUrl("module")}},{key:"getDefaultPostParams",value:function(){return this.withToken||this.isRequestToApiMethod()||P.shouldPropagateTokenAuth?{token_auth:P.token_auth,force_api_session:broadcast.isWidgetizeRequestWithoutSession()?0:1}:{}}},{key:"mixinDefaultPostParams",value:function(e){var t=this.getDefaultPostParams(),n=Se(Se({},t),e);return n}},{key:"mixinDefaultGetParams",value:function(e){var t=this,n=ke.getSearchParam("segment"),r={idSite:P.idSite?P.idSite.toString():broadcast.getValueFromUrl("idSite"),period:P.period||broadcast.getValueFromUrl("period"),segment:n},a=e;return a.token_auth&&(a.token_auth=null,delete a.token_auth),Object.keys(r).forEach((function(e){t.useGETDefaultParameter(e)&&!a[e]&&!t.postParams[e]&&r[e]&&(a[e]=r[e])})),!this.useGETDefaultParameter("date")||a.date||this.postParams.date||(a.date=P.currentDateString),a}}],[{key:"fetch",value:function(t){var n=new e;return n.setFormat("json"),n.addParams(Se({module:"API",format:"json"},t),"get"),n.send()}}]),e}();function $e(){return globalAjaxQueue}window.ajaxHelper=Ae,angular.module("piwikApp.service").service("globalAjaxQueue",$e);var He={ref:"root"};function Ne(e,t,n,r,a,i){return Object(o["withDirectives"])((Object(o["openBlock"])(),Object(o["createElementBlock"])("div",He,[Object(o["renderSlot"])(e.$slots,"default")],512)),[[o["vShow"],e.modelValue]])}var Fe=Object(o["defineComponent"])({props:{modelValue:{type:Boolean,required:!0},element:{type:HTMLElement,required:!1}},emits:["yes","no","closeEnd","close","update:modelValue"],activated:function(){this.$emit("update:modelValue",!1)},watch:{modelValue:function(e,t){var n=this;if(e){var r=this.element||this.$refs.root.firstElementChild;P.helper.modalConfirm(r,{yes:function(){n.$emit("yes")},no:function(){n.$emit("no")}},{onCloseEnd:function(){n.element||n.$refs.root.appendChild(r),n.$emit("update:modelValue",!1),n.$emit("closeEnd")}})}else!1===e&&!0===t&&this.$emit("close")}}});Fe.render=Ne;var Be=Fe;function Ue(e,t){return qe(e)||Me(e,t)||_e(e,t)||Re()}function Re(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _e(e,t){if(e){if("string"===typeof e)return Ve(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?Ve(e,t):void 0}}function Ve(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function Me(e,t){var n=null==e?null:"undefined"!==typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,a,o=[],i=!0,s=!1;try{for(n=n.call(e);!(i=(r=n.next()).done);i=!0)if(o.push(r.value),t&&o.length===t)break}catch(c){s=!0,a=c}finally{try{i||null==n["return"]||n["return"]()}finally{if(s)throw a}}return o}}function qe(e){if(Array.isArray(e))return e}
+ */function Ie(e,t){if("abort"!==t)if("undefined"!==typeof Piwik_Popover){var n=$("#loadingError");Piwik_Popover.isOpen()&&e&&500===e.status?e&&500===e.status&&$(document.body).html(piwikHelper.escape(e.responseText)):n.show()}else console.log("Request failed: ".concat(e.responseText))}ge.updatePeriodParamsFromUrl=we.updatePeriodParamsFromUrl.bind(we),De.$inject=[],angular.module("piwikApp.service").service("piwikUrl",De),window.angular.module("piwikApp.service").service("piwik",Oe),je.$inject=["piwik","$rootScope"],window.angular.module("piwikApp.service").run(je),window.globalAjaxQueue=[],window.globalAjaxQueue.active=0,window.globalAjaxQueue.clean=function(){for(var e=this.length;e>=0;e-=1)this[e]&&4!==this[e].readyState||this.splice(e,1)},window.globalAjaxQueue.push=function(){for(var e,t=arguments.length,n=new Array(t),r=0;r<t;r++)n[r]=arguments[r];return this.active+=n.length,this.clean(),(e=Array.prototype.push).call.apply(e,[this].concat(n))},window.globalAjaxQueue.abort=function(){this.forEach((function(e){return e&&e.abort&&e.abort()})),this.splice(0,this.length),this.active=0};var He=function(){function e(){Se(this,e),xe(this,"format","json"),xe(this,"timeout",null),xe(this,"callback",null),xe(this,"useRegularCallbackInCaseOfError",!1),xe(this,"errorCallback",void 0),xe(this,"withToken",!1),xe(this,"completeCallback",void 0),xe(this,"getParams",{}),xe(this,"getUrl","?"),xe(this,"postParams",{}),xe(this,"loadingElement",null),xe(this,"errorElement","#ajaxError"),xe(this,"requestHandle",null),xe(this,"defaultParams",["idSite","period","date","segment"]),this.errorCallback=Ie}return Te(e,[{key:"addParams",value:function(e,t){var n=this,r="string"===typeof e?window.broadcast.getValuesFromUrl(e):e,a=["compareSegments","comparePeriods","compareDates"];Object.keys(r).forEach((function(e){var o=r[e];(-1===a.indexOf(e)||o)&&("get"===t.toLowerCase()?n.getParams[e]=o:"post"===t.toLowerCase()&&(n.postParams[e]=o))}))}},{key:"withTokenInUrl",value:function(){this.withToken=!0}},{key:"setUrl",value:function(e){this.addParams(broadcast.getValuesFromUrl(e),"GET")}},{key:"setBulkRequests",value:function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];var r=t.map((function(e){return"string"===typeof e?e:$.param(e)}));this.addParams({module:"API",method:"API.getBulkRequest",urls:r,format:"json"},"post")}},{key:"setTimeout",value:function(e){this.timeout=e}},{key:"setCallback",value:function(e){this.callback=e}},{key:"useCallbackInCaseOfError",value:function(){this.useRegularCallbackInCaseOfError=!0}},{key:"redirectOnSuccess",value:function(e){this.setCallback((function(){piwikHelper.redirect(e)}))}},{key:"setErrorCallback",value:function(e){this.errorCallback=e}},{key:"setCompleteCallback",value:function(e){this.completeCallback=e}},{key:"setFormat",value:function(e){this.format=e}},{key:"setLoadingElement",value:function(e){this.loadingElement=e||"#ajaxLoadingDiv"}},{key:"setErrorElement",value:function(e){e&&(this.errorElement=e)}},{key:"useGETDefaultParameter",value:function(e){if(e&&this.defaultParams)for(var t=0;t<this.defaultParams.length;t+=1)if(this.defaultParams[t]===e)return!0;return!1}},{key:"removeDefaultParameter",value:function(e){if(e&&this.defaultParams)for(var t=0;t<this.defaultParams.length;t+=1)this.defaultParams[t]===e&&this.defaultParams.splice(t,1)}},{key:"send",value:function(){var e=this;return $(this.errorElement).length&&$(this.errorElement).hide(),this.loadingElement&&$(this.loadingElement).fadeIn(),this.requestHandle=this.buildAjaxCall(),window.globalAjaxQueue.push(this.requestHandle),new Promise((function(t,n){e.requestHandle.then(t).fail((function(t){"abort"!==t.statusText&&(console.log("Warning: the ".concat($.param(e.getParams)," request failed!")),n(t))}))}))}},{key:"abort",value:function(){this.requestHandle&&"function"===typeof this.requestHandle.abort&&(this.requestHandle.abort(),this.requestHandle=null)}},{key:"buildAjaxCall",value:function(){var e=this,t=this,n=this.mixinDefaultGetParams(this.getParams),r=this.getUrl;"?"!==r[r.length-1]&&(r+="&"),n.segment&&(r="".concat(r,"segment=").concat(n.segment,"&"),delete n.segment),n.date&&(r="".concat(r,"date=").concat(decodeURIComponent(n.date.toString()),"&"),delete n.date),r+=$.param(n);var a={type:"POST",async:!0,url:r,dataType:this.format||"json",complete:this.completeCallback,error:function(){if(window.globalAjaxQueue.active-=1,t.errorCallback){for(var e=arguments.length,n=new Array(e),r=0;r<e;r++)n[r]=arguments[r];t.errorCallback.apply(this,n)}},success:function(t,n,r){if(e.loadingElement&&$(e.loadingElement).hide(),t&&"error"===t.result&&!e.useRegularCallbackInCaseOfError){var a=null,o="toast";if($(e.errorElement).length&&t.message&&($(e.errorElement).show(),a=e.errorElement,o=null),t.message){var i=window["require"]("piwik/UI"),l=new i.Notification;l.show(t.message,{placeat:a,context:"error",type:o,id:"ajaxHelper"}),l.scrollToNotification()}}else e.callback&&e.callback(t,n,r);window.globalAjaxQueue.active-=1,j.ajaxRequestFinished&&j.ajaxRequestFinished()},data:this.mixinDefaultPostParams(this.postParams),timeout:null!==this.timeout?this.timeout:void 0};return $.ajax(a)}},{key:"isRequestToApiMethod",value:function(){return this.getParams&&"API"===this.getParams.module&&this.getParams.method||this.postParams&&"API"===this.postParams.module&&this.postParams.method}},{key:"isWidgetizedRequest",value:function(){return"Widgetize"===broadcast.getValueFromUrl("module")}},{key:"getDefaultPostParams",value:function(){return this.withToken||this.isRequestToApiMethod()||j.shouldPropagateTokenAuth?{token_auth:j.token_auth,force_api_session:broadcast.isWidgetizeRequestWithoutSession()?0:1}:{}}},{key:"mixinDefaultPostParams",value:function(e){var t=this.getDefaultPostParams(),n=Ce(Ce({},t),e);return n}},{key:"mixinDefaultGetParams",value:function(e){var t=this,n=ke.getSearchParam("segment"),r={idSite:j.idSite?j.idSite.toString():broadcast.getValueFromUrl("idSite"),period:j.period||broadcast.getValueFromUrl("period"),segment:n},a=e;return a.token_auth&&(a.token_auth=null,delete a.token_auth),Object.keys(r).forEach((function(e){t.useGETDefaultParameter(e)&&!a[e]&&!t.postParams[e]&&r[e]&&(a[e]=r[e])})),!this.useGETDefaultParameter("date")||a.date||this.postParams.date||(a.date=j.currentDateString),a}}],[{key:"fetch",value:function(t){var n=new e;return n.setFormat("json"),n.addParams(Ce({module:"API",format:"json"},t),"get"),n.send()}}]),e}();function Ae(){return globalAjaxQueue}
/*!
* Matomo - free/libre analytics platform
*
* @link https://matomo.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- */var Ge=0;function Le(e){var t=e.component,n=e.scope,r=void 0===n?{}:n,a=e.events,i=void 0===a?{}:a,s=e.$inject,c=e.directiveName,l=e.transclude,u=e.mountPointFactory,d=e.postCreate,p=e.noScope,f=e.restrict,m=void 0===f?"A":f,g=Ge;l&&(Ge+=1);var h={};function v(){for(var e=arguments.length,n=new Array(e),a=0;a<e;a++)n[a]=arguments[a];var s={restrict:m,scope:p?void 0:h,compile:function(){return{post:function(e,a,s){var c=l?a.find("[ng-transclude][counter=".concat(g,"]")):null,p="<root-component";Object.entries(r).forEach((function(e){var t=Ue(e,2),n=t[1];p+=" :".concat(n.vue,'="').concat(n.vue,'"')})),Object.entries(i).forEach((function(e){var t=Ue(e,1),n=t[0];p+=" @".concat(n,"=\"onEventHandler('").concat(n,"', $event)\"")})),p+=">",l&&(p+='<div ref="transcludeTarget"/>'),p+="</root-component>";var f=Object(o["createApp"])({template:p,data:function(){var t={};return Object.entries(r).forEach((function(r){var o=Ue(r,2),i=o[0],c=o[1],l=e[i];"undefined"===typeof l&&"undefined"!==typeof c.default&&(l=c.default instanceof Function?c.default.apply(c,[e,a,s].concat(n)):c.default),t[c.vue]=l})),t},setup:function(){if(l){var e=Object(o["ref"])(null);return{transcludeTarget:e}}},methods:{onEventHandler:function(t,r){i[t]&&i[t].apply(i,[r,e,a,s].concat(n))}}});f.config.globalProperties.$sanitize=window.vueSanitize,f.config.globalProperties.translate=C,f.component("root-component",t);var m=u?u.apply(void 0,[e,a,s].concat(n)):a[0],h=f.mount(m);Object.entries(r).forEach((function(t){var r=Ue(t,2),o=r[0],i=r[1];i.angularJsBind&&e.$watch(o,(function(t){"undefined"!==typeof i.default&&"undefined"===typeof t?h[o]=i.default instanceof Function?i.default.apply(i,[e,a,s].concat(n)):i.default:h[o]=t}))})),l&&$(h.transcludeTarget).append(c),d&&d.apply(void 0,[h,e,a,s].concat(n)),a.on("$destroy",(function(){f.unmount()}))}}}};return l&&(s.transclude=!0,s.template='<div ng-transclude counter="'.concat(g,'"/>')),s}return Object.entries(r).forEach((function(e){var t=Ue(e,2),n=t[0],r=t[1];r.vue||(r.vue=n),r.angularJsBind&&(h[n]=r.angularJsBind)})),v.$inject=s||[],angular.module("piwikApp").directive(c,v),v}
+ */
+function $e(e){e.classList.toggle("expanded");var t=e.querySelector(".dropdown.positionInViewport");t&&j.helper.setMarginLeftToBeInViewport(t)}function Be(e,t,n){var r=t.value.isMouseDown&&t.value.hasScrolled;t.value.isMouseDown=!1,t.value.hasScrolled=!1,r||e.contains(n.target)||e.classList.remove("expanded")}function Ne(e){e.value.hasScrolled=!0}function Me(e){e.value.isMouseDown=!0,e.value.hasScrolled=!1}function Fe(e,t,n){27===n.which&&(t.value.isMouseDown=!1,t.value.hasScrolled=!1,e.classList.remove("expanded"))}window.ajaxHelper=He,angular.module("piwikApp.service").service("globalAjaxQueue",Ae);var Re=document.documentElement,Ve={mounted:function(e,t){t.value.isMouseDown=!1,t.value.hasScrolled=!1,t.value.onExpand=$e.bind(null,e),t.value.onEscapeHandler=Fe.bind(null,e,t),t.value.onMouseDown=Me.bind(null,t),t.value.onClickOutsideElement=Be.bind(null,e,t),t.value.onScroll=Ne.bind(null,t),t.value.expander.addEventListener("click",t.value.onExpand),Re.addEventListener("keyup",t.value.onEscapeHandler),Re.addEventListener("mousedown",t.value.onMouseDown),Re.addEventListener("mouseup",t.value.onClickOutsideElement),Re.addEventListener("scroll",t.value.onScroll)},unmounted:function(e,t){t.value.expander.removeEventListener("click",t.value.onExpand),Re.removeEventListener("keyup",t.value.onEscapeHandler),Re.removeEventListener("mousedown",t.value.onMouseDown),Re.removeEventListener("mouseup",t.value.onClickOutsideElement),Re.removeEventListener("scroll",t.value.onScroll)}};
+/*!
+ * Matomo - free/libre analytics platform
+ *
+ * @link https://matomo.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+function Le(){return{restrict:"A",link:function(e,t){var n={instance:null,value:{expander:t.find(".title").first()[0]},oldValue:null,modifiers:{},dir:{}},r=Ve;r.mounted(t[0],n),t.on("$destroy",(function(){return r.unmounted(t[0],n)}))}}}
+/*!
+ * Matomo - free/libre analytics platform
+ *
+ * @link https://matomo.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+function Ue(e){e.classList.add("expanded");var t=e.querySelector(".dropdown.positionInViewport");t&&j.helper.setMarginLeftToBeInViewport(t)}function _e(e){e.classList.remove("expanded")}function Je(e,t){e.contains(t.target)||e.classList.remove("expanded")}function qe(e,t){27===t.which&&e.classList.remove("expanded")}Le.$inject=[],angular.module("piwikApp").directive("piwikExpandOnClick",Le);var Ge=document.documentElement,Qe={mounted:function(e,t){t.value.onMouseEnter=Ue.bind(null,e),t.value.onMouseLeave=_e.bind(null,e),t.value.onClickOutsideElement=Je.bind(null,e),t.value.onEscapeHandler=qe.bind(null,e),t.value.expander.addEventListener("mouseenter",t.value.onMouseEnter),e.addEventListener("mouseleave",t.value.onMouseLeave),Ge.addEventListener("keyup",t.value.onEscapeHandler),Ge.addEventListener("mouseup",t.value.onClickOutsideElement)},unmounted:function(e,t){t.value.expander.removeEventListener("mouseenter",t.value.onMouseEnter),e.removeEventListener("mouseleave",t.value.onMouseLeave),document.removeEventListener("keyup",t.value.onEscapeHandler),document.removeEventListener("mouseup",t.value.onClickOutsideElement)}};
+/*!
+ * Matomo - free/libre analytics platform
+ *
+ * @link https://matomo.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+function ze(){return{restrict:"A",link:function(e,t){var n={instance:null,value:{expander:t.find(".title").first()[0]},oldValue:null,modifiers:{},dir:{}},r=Qe;r.mounted(t[0],n),t.on("$destroy",(function(){return r.unmounted(t[0],n)}))}}}ze.$inject=[],angular.module("piwikApp").directive("piwikExpandOnHover",ze);var Ye={ref:"root"};function We(e,t,n,r,a,i){return Object(o["withDirectives"])((Object(o["openBlock"])(),Object(o["createElementBlock"])("div",Ye,[Object(o["renderSlot"])(e.$slots,"default")],512)),[[o["vShow"],e.modelValue]])}var Ke=Object(o["defineComponent"])({props:{modelValue:{type:Boolean,required:!0},element:{type:HTMLElement,required:!1}},emits:["yes","no","closeEnd","close","update:modelValue"],activated:function(){this.$emit("update:modelValue",!1)},watch:{modelValue:function(e,t){var n=this;if(e){var r=this.element||this.$refs.root.firstElementChild;j.helper.modalConfirm(r,{yes:function(){n.$emit("yes")},no:function(){n.$emit("no")}},{onCloseEnd:function(){n.element||n.$refs.root.appendChild(r),n.$emit("update:modelValue",!1),n.$emit("closeEnd")}})}else!1===e&&!0===t&&this.$emit("close")}}});Ke.render=We;var Xe=Ke;function Ze(e,t){return at(e)||rt(e,t)||tt(e,t)||et()}function et(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function tt(e,t){if(e){if("string"===typeof e)return nt(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?nt(e,t):void 0}}function nt(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function rt(e,t){var n=null==e?null:"undefined"!==typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,a,o=[],i=!0,l=!1;try{for(n=n.call(e);!(i=(r=n.next()).done);i=!0)if(o.push(r.value),t&&o.length===t)break}catch(s){l=!0,a=s}finally{try{i||null==n["return"]||n["return"]()}finally{if(l)throw a}}return o}}function at(e){if(Array.isArray(e))return e}
+/*!
+ * Matomo - free/libre analytics platform
+ *
+ * @link https://matomo.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */var ot=0;function it(e){return e.substring(0,1).toLowerCase()+e.substring(1).replace(/[A-Z]/g,(function(e){return"-".concat(e.toLowerCase())}))}function lt(e){return e.substring(0,1).toLowerCase()+e.substring(1).replace(/-([a-z])/g,(function(e,t){return t.toUpperCase()}))}function st(e){var t=e.component,n=e.scope,r=void 0===n?{}:n,a=e.events,i=void 0===a?{}:a,l=e.$inject,s=e.directiveName,c=e.transclude,u=e.mountPointFactory,d=e.postCreate,p=e.noScope,f=e.restrict,m=void 0===f?"A":f,h=ot;c&&(ot+=1);var g={};function v(){for(var e=arguments.length,n=new Array(e),a=0;a<e;a++)n[a]=arguments[a];var l={restrict:m,scope:p?void 0:g,compile:function(){return{post:function(e,a,l){var s=c?a.find("[ng-transclude][counter=".concat(h,"]")):null,p="<root-component";Object.entries(i).forEach((function(e){var t=Ze(e,1),n=t[0];p+=" @".concat(n,"=\"onEventHandler('").concat(n,"', $event)\"")})),Object.entries(r).forEach((function(e){var t=Ze(e,2),n=t[0],r=t[1];if("&"===r.angularJsBind){var a=it(n);i[a]||(p+=" @".concat(a,"=\"onEventHandler('").concat(a,"', $event)\""))}else p+=" :".concat(r.vue,'="').concat(r.vue,'"')})),p+=">",c&&(p+='<div ref="transcludeTarget"/>'),p+="</root-component>";var f=Object(o["createApp"])({template:p,data:function(){var t={};return Object.entries(r).forEach((function(r){var o=Ze(r,2),i=o[0],s=o[1],c=e[i];"undefined"===typeof c&&"undefined"!==typeof s.default&&(c=s.default instanceof Function?s.default.apply(s,[e,a,l].concat(n)):s.default),t[s.vue]=c})),t},setup:function(){if(c){var e=Object(o["ref"])(null);return{transcludeTarget:e}}},methods:{onEventHandler:function(t,r){var o=lt(t);e[o]&&e[o](r),i[t]&&i[t].apply(i,[r,e,a,l].concat(n))}}});f.config.globalProperties.$sanitize=window.vueSanitize,f.config.globalProperties.translate=P,f.component("root-component",t);var m=u?u.apply(void 0,[e,a,l].concat(n)):a[0],g=f.mount(m);Object.entries(r).forEach((function(t){var r=Ze(t,2),o=r[0],i=r[1];i.angularJsBind&&"&"!==i.angularJsBind&&e.$watch(o,(function(t){"undefined"!==typeof i.default&&"undefined"===typeof t?g[o]=i.default instanceof Function?i.default.apply(i,[e,a,l].concat(n)):i.default:g[o]=t}))})),c&&$(g.transcludeTarget).append(s),d&&d.apply(void 0,[g,e,a,l].concat(n)),a.on("$destroy",(function(){f.unmount()}))}}}};return c&&(l.transclude=!0,l.template='<div ng-transclude counter="'.concat(h,'"/>')),l}return Object.entries(r).forEach((function(e){var t=Ze(e,2),n=t[0],r=t[1];r.vue||(r.vue=n),r.angularJsBind&&(g[n]=r.angularJsBind)})),v.$inject=l||[],angular.module("piwikApp").directive(s,v),v}
+/*!
+ * Matomo - free/libre analytics platform
+ *
+ * @link https://matomo.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */st({component:Xe,scope:{show:{vue:"modelValue",default:!1},element:{default:function(e,t){return t[0]}}},events:{yes:function(e,t,n,r){r.yes&&(t.$eval(r.yes),setTimeout((function(){t.$apply()}),0))},no:function(e,t,n,r){r.no&&(t.$eval(r.no),setTimeout((function(){t.$apply()}),0))},close:function(e,t,n,r){r.close&&(t.$eval(r.close),setTimeout((function(){t.$apply()}),0))},"update:modelValue":function(e,t,n,r,a){setTimeout((function(){t.$apply(a(r.piwikDialog).assign(t,e))}),0)}},$inject:["$parse"],directiveName:"piwikDialog",transclude:!0,mountPointFactory:function(e,t){var n=$('<div class="vue-placeholder"/>');return n.appendTo(t),n[0]},postCreate:function(e,t,n,r){t.$watch(r.piwikDialog,(function(t,n){n!==t&&(e.modelValue=t||!1)}))},noScope:!0});var ct={key:0,class:"title",tabindex:"6"},ut=["href","title"],dt={class:"iconsBar"},pt=["href","title"],ft=Object(o["createElementVNode"])("span",{class:"icon-help"},null,-1),mt=[ft],ht=["title"],gt=Object(o["createElementVNode"])("span",{class:"icon-info"},null,-1),vt=[gt],bt={class:"ratingIcons"},yt={class:"inlineHelp"},wt=["innerHTML"],kt=["href"];function Dt(e,t,n,r,a,i){var l=Object(o["resolveComponent"])("RateFeature");return Object(o["openBlock"])(),Object(o["createElementBlock"])("div",{class:"enrichedHeadline",onMouseenter:t[1]||(t[1]=function(t){return e.showIcons=!0}),onMouseleave:t[2]||(t[2]=function(t){return e.showIcons=!1}),ref:"root"},[e.editUrl?Object(o["createCommentVNode"])("",!0):(Object(o["openBlock"])(),Object(o["createElementBlock"])("div",ct,[Object(o["renderSlot"])(e.$slots,"default")])),e.editUrl?(Object(o["openBlock"])(),Object(o["createElementBlock"])("a",{key:1,class:"title",href:e.editUrl,title:e.translate("CoreHome_ClickToEditX",e.$sanitize(e.actualFeatureName))},[Object(o["renderSlot"])(e.$slots,"default")],8,ut)):Object(o["createCommentVNode"])("",!0),Object(o["withDirectives"])(Object(o["createElementVNode"])("span",dt,[e.helpUrl&&!e.actualInlineHelp?(Object(o["openBlock"])(),Object(o["createElementBlock"])("a",{key:0,rel:"noreferrer noopener",target:"_blank",class:"helpIcon",href:e.helpUrl,title:e.translate("CoreHome_ExternalHelp")},mt,8,pt)):Object(o["createCommentVNode"])("",!0),e.actualInlineHelp?(Object(o["openBlock"])(),Object(o["createElementBlock"])("a",{key:1,onClick:t[0]||(t[0]=function(t){return e.showInlineHelp=!e.showInlineHelp}),class:Object(o["normalizeClass"])(["helpIcon",{active:e.showInlineHelp}]),title:e.translate(e.reportGenerated?"General_HelpReport":"General_Help")},vt,10,ht)):Object(o["createCommentVNode"])("",!0),Object(o["createElementVNode"])("div",bt,[Object(o["createVNode"])(l,{title:e.actualFeatureName},null,8,["title"])])],512),[[o["vShow"],e.showIcons||e.showInlineHelp]]),Object(o["withDirectives"])(Object(o["createElementVNode"])("div",yt,[Object(o["createElementVNode"])("div",{innerHTML:e.$sanitize(e.actualInlineHelp)},null,8,wt),e.helpUrl?(Object(o["openBlock"])(),Object(o["createElementBlock"])("a",{key:0,rel:"noreferrer noopener",target:"_blank",class:"readMore",href:e.helpUrl},Object(o["toDisplayString"])(e.translate("General_MoreDetails")),9,kt)):Object(o["createCommentVNode"])("",!0)],512),[[o["vShow"],e.showInlineHelp]])],544)}var Ot=Object(o["defineAsyncComponent"])((function(){return new Promise((function(e){window.$(document).ready((function(){e(window.Feedback.RateFeature)}))}))})),jt=Object(o["defineComponent"])({props:{helpUrl:{type:String,default:""},editUrl:{type:String,default:""},reportGenerated:String,featureName:String,inlineHelp:String},components:{RateFeature:Ot},data:function(){return{showIcons:!1,showInlineHelp:!1,actualFeatureName:this.featureName,actualInlineHelp:this.inlineHelp}},watch:{inlineHelp:function(e){this.actualInlineHelp=e},featureName:function(e){this.actualFeatureName=e}},mounted:function(){var e=this,t=this.$refs.root;setTimeout((function(){if(!e.actualInlineHelp){var n=t.querySelector(".title .inlineHelp");if(!n&&t.parentElement.nextElementSibling&&(n=t.parentElement.nextElementSibling.querySelector(".reportDocumentation")),n){var r=n.getAttribute("data-content").trim();r.length&&(e.actualInlineHelp="<p>".concat(r,"</p>"),setTimeout((function(){return n.remove()}),0))}}e.actualFeatureName||(e.actualFeatureName=t.querySelector(".title").textContent),e.reportGenerated&&p.parse(j.period,j.currentDateString).containsToday()&&window.$(t.querySelector(".report-generated")).tooltip({track:!0,content:e.reportGenerated,items:"div",show:!1,hide:!1})}))}});jt.render=Dt;var Pt=jt,Ct=(st({component:Pt,scope:{helpUrl:{angularJsBind:"@"},editUrl:{angularJsBind:"@"},reportGenerated:{angularJsBind:"@?"},featureName:{angularJsBind:"@"},inlineHelp:{angularJsBind:"@?"}},directiveName:"piwikEnrichedHeadline",transclude:!0}),{class:"card",ref:"root"}),St={class:"card-content"},Et={key:0,class:"card-title"},Tt={key:1,class:"card-title"},xt={ref:"content"};
+/*!
+ * Matomo - free/libre analytics platform
+ *
+ * @link https://matomo.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */function It(e,t,n,r,a,i){var l=Object(o["resolveComponent"])("EnrichedHeadline");return Object(o["openBlock"])(),Object(o["createElementBlock"])("div",Ct,[Object(o["createElementVNode"])("div",St,[!e.contentTitle||e.actualFeature||e.helpUrl||e.actualHelpText?Object(o["createCommentVNode"])("",!0):(Object(o["openBlock"])(),Object(o["createElementBlock"])("h2",Et,Object(o["toDisplayString"])(e.contentTitle),1)),e.contentTitle&&(e.actualFeature||e.helpUrl||e.actualHelpText)?(Object(o["openBlock"])(),Object(o["createElementBlock"])("h2",Tt,[Object(o["createVNode"])(l,{"feature-name":e.actualFeature,"help-url":e.helpUrl,"inline-help":e.actualHelpText},{default:Object(o["withCtx"])((function(){return[Object(o["createTextVNode"])(Object(o["toDisplayString"])(e.contentTitle),1)]})),_:1},8,["feature-name","help-url","inline-help"])])):Object(o["createCommentVNode"])("",!0),Object(o["createElementVNode"])("div",xt,[Object(o["renderSlot"])(e.$slots,"default")],512)])],512)}var Ht=null,At=Object(o["defineComponent"])({props:{contentTitle:String,feature:String,helpUrl:String,helpText:String,anchor:String},components:{EnrichedHeadline:Pt},data:function(){return{actualFeature:this.feature,actualHelpText:this.helpText}},watch:{feature:function(e){this.actualFeature=e},helpText:function(e){this.actualHelpText=e}},mounted:function(){var e,t=this,n=this.$refs,r=n.root,a=n.content;if(this.anchor){var o=document.createElement("a");o.id=this.anchor,r.parentElement.prepend(o)}if(setTimeout((function(){var e=a.querySelector(".contentHelp");e&&(t.actualHelpText=e.innerHTML,e.remove())}),0),!this.actualFeature||!0!==this.actualFeature&&"true"!==this.actualFeature||(this.actualFeature=this.contentTitle),null===Ht&&(Ht=document.querySelector("#content.admin")),Ht&&(e=Ht.offsetTop),e||0===e){var i=r.closest("[piwik-widget-loader]"),l=i?i.offsetTop:r.offsetTop;l-e<17&&(r.style.marginTop=0)}}});At.render=It;var $t=At;
+/*!
+ * Matomo - free/libre analytics platform
+ *
+ * @link https://matomo.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */st({component:$t,scope:{contentTitle:{angularJsBind:"@"},feature:{angularJsBind:"@"},helpUrl:{angularJsBind:"@"},helpText:{angularJsBind:"@"},anchor:{angularJsBind:"@?"}},directiveName:"piwikContentBlock",transclude:!0});function Bt(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function Nt(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function Mt(e,t,n){return t&&Nt(e.prototype,t),n&&Nt(e,n),e}function Ft(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}
/*!
* Matomo - free/libre analytics platform
*
* @link https://matomo.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- */Le({component:Be,scope:{show:{vue:"modelValue",default:!1},element:{default:function(e,t){return t[0]}}},events:{yes:function(e,t,n,r){r.yes&&(t.$eval(r.yes),setTimeout((function(){t.$apply()}),0))},no:function(e,t,n,r){r.no&&(t.$eval(r.no),setTimeout((function(){t.$apply()}),0))},close:function(e,t,n,r){r.close&&(t.$eval(r.close),setTimeout((function(){t.$apply()}),0))},"update:modelValue":function(e,t,n,r,a){setTimeout((function(){t.$apply(a(r.piwikDialog).assign(t,e))}),0)}},$inject:["$parse"],directiveName:"piwikDialog",transclude:!0,mountPointFactory:function(e,t){var n=$('<div class="vue-placeholder"/>');return n.appendTo(t),n[0]},postCreate:function(e,t,n,r){t.$watch(r.piwikDialog,(function(t,n){n!==t&&(e.modelValue=t||!1)}))},noScope:!0});var Qe={key:0,class:"title",tabindex:"6"},Je=["href","title"],ze={class:"iconsBar"},Ye=["href","title"],We=Object(o["createElementVNode"])("span",{class:"icon-help"},null,-1),Xe=[We],Ke=["title"],Ze=Object(o["createElementVNode"])("span",{class:"icon-info"},null,-1),et=[Ze],tt={class:"ratingIcons"},nt={class:"inlineHelp"},rt=["innerHTML"],at=["href"];function ot(e,t,n,r,a,i){var s=Object(o["resolveComponent"])("RateFeature");return Object(o["openBlock"])(),Object(o["createElementBlock"])("div",{class:"enrichedHeadline",onMouseenter:t[1]||(t[1]=function(t){return e.showIcons=!0}),onMouseleave:t[2]||(t[2]=function(t){return e.showIcons=!1}),ref:"root"},[e.editUrl?Object(o["createCommentVNode"])("",!0):(Object(o["openBlock"])(),Object(o["createElementBlock"])("div",Qe,[Object(o["renderSlot"])(e.$slots,"default")])),e.editUrl?(Object(o["openBlock"])(),Object(o["createElementBlock"])("a",{key:1,class:"title",href:e.editUrl,title:e.translate("CoreHome_ClickToEditX",e.$sanitize(e.actualFeatureName))},[Object(o["renderSlot"])(e.$slots,"default")],8,Je)):Object(o["createCommentVNode"])("",!0),Object(o["withDirectives"])(Object(o["createElementVNode"])("span",ze,[e.helpUrl&&!e.actualInlineHelp?(Object(o["openBlock"])(),Object(o["createElementBlock"])("a",{key:0,rel:"noreferrer noopener",target:"_blank",class:"helpIcon",href:e.helpUrl,title:e.translate("CoreHome_ExternalHelp")},Xe,8,Ye)):Object(o["createCommentVNode"])("",!0),e.actualInlineHelp?(Object(o["openBlock"])(),Object(o["createElementBlock"])("a",{key:1,onClick:t[0]||(t[0]=function(t){return e.showInlineHelp=!e.showInlineHelp}),class:Object(o["normalizeClass"])(["helpIcon",{active:e.showInlineHelp}]),title:e.translate(e.reportGenerated?"General_HelpReport":"General_Help")},et,10,Ke)):Object(o["createCommentVNode"])("",!0),Object(o["createElementVNode"])("div",tt,[Object(o["createVNode"])(s,{title:e.actualFeatureName},null,8,["title"])])],512),[[o["vShow"],e.showIcons||e.showInlineHelp]]),Object(o["withDirectives"])(Object(o["createElementVNode"])("div",nt,[Object(o["createElementVNode"])("div",{innerHTML:e.$sanitize(e.actualInlineHelp)},null,8,rt),e.helpUrl?(Object(o["openBlock"])(),Object(o["createElementBlock"])("a",{key:0,rel:"noreferrer noopener",target:"_blank",class:"readMore",href:e.helpUrl},Object(o["toDisplayString"])(e.translate("General_MoreDetails")),9,at)):Object(o["createCommentVNode"])("",!0)],512),[[o["vShow"],e.showInlineHelp]])],544)}var it=Object(o["defineAsyncComponent"])((function(){return new Promise((function(e){window.$(document).ready((function(){e(window.Feedback.RateFeature)}))}))})),st=Object(o["defineComponent"])({props:{helpUrl:{type:String,default:""},editUrl:{type:String,default:""},reportGenerated:String,featureName:String,inlineHelp:String},components:{RateFeature:it},data:function(){return{showIcons:!1,showInlineHelp:!1,actualFeatureName:this.featureName,actualInlineHelp:this.inlineHelp}},watch:{inlineHelp:function(e){this.actualInlineHelp=e},featureName:function(e){this.actualFeatureName=e}},mounted:function(){var e=this,t=this.$refs.root;setTimeout((function(){if(!e.actualInlineHelp){var n=t.querySelector(".title .inlineHelp");if(!n&&t.parentElement.nextElementSibling&&(n=t.parentElement.nextElementSibling.querySelector(".reportDocumentation")),n){var r=n.getAttribute("data-content").trim();r.length&&(e.actualInlineHelp="<p>".concat(r,"</p>"),setTimeout((function(){return n.remove()}),0))}}e.actualFeatureName||(e.actualFeatureName=t.querySelector(".title").textContent),e.reportGenerated&&p.parse(P.period,P.currentDateString).containsToday()&&window.$(t.querySelector(".report-generated")).tooltip({track:!0,content:e.reportGenerated,items:"div",show:!1,hide:!1})}))}});st.render=ot;var ct=st,lt=(Le({component:ct,scope:{helpUrl:{angularJsBind:"@"},editUrl:{angularJsBind:"@"},reportGenerated:{angularJsBind:"@?"},featureName:{angularJsBind:"@"},inlineHelp:{angularJsBind:"@?"}},directiveName:"piwikEnrichedHeadline",transclude:!0}),{class:"card",ref:"root"}),ut={class:"card-content"},dt={key:0,class:"card-title"},pt={key:1,class:"card-title"},ft={ref:"content"};
+ */var Rt=function(){function e(){var t=this;Bt(this,e),Ft(this,"segmentState",Object(o["reactive"])({availableSegments:[]})),j.on("piwikSegmentationInited",(function(){return t.setSegmentState()}))}return Mt(e,[{key:"state",get:function(){return Object(o["readonly"])(this.segmentState)}},{key:"setSegmentState",value:function(){try{var e=$(".segmentEditorPanel").data("uiControlObject");this.segmentState.availableSegments=e.impl.availableSegments||[]}catch(t){}}}]),e}(),Vt=new Rt;function Lt(e){return qt(e)||Jt(e)||_t(e)||Ut()}function Ut(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _t(e,t){if(e){if("string"===typeof e)return Gt(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?Gt(e,t):void 0}}function Jt(e){if("undefined"!==typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}function qt(e){if(Array.isArray(e))return Gt(e)}function Gt(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function Qt(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function zt(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?Qt(Object(n),!0).forEach((function(t){Xt(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):Qt(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function Yt(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function Wt(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function Kt(e,t,n){return t&&Wt(e.prototype,t),n&&Wt(e,n),e}function Xt(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}
/*!
* Matomo - free/libre analytics platform
*
* @link https://matomo.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- */function mt(e,t,n,r,a,i){var s=Object(o["resolveComponent"])("EnrichedHeadline");return Object(o["openBlock"])(),Object(o["createElementBlock"])("div",lt,[Object(o["createElementVNode"])("div",ut,[!e.contentTitle||e.actualFeature||e.helpUrl||e.actualHelpText?Object(o["createCommentVNode"])("",!0):(Object(o["openBlock"])(),Object(o["createElementBlock"])("h2",dt,Object(o["toDisplayString"])(e.contentTitle),1)),e.contentTitle&&(e.actualFeature||e.helpUrl||e.actualHelpText)?(Object(o["openBlock"])(),Object(o["createElementBlock"])("h2",pt,[Object(o["createVNode"])(s,{"feature-name":e.actualFeature,"help-url":e.helpUrl,"inline-help":e.actualHelpText},{default:Object(o["withCtx"])((function(){return[Object(o["createTextVNode"])(Object(o["toDisplayString"])(e.contentTitle),1)]})),_:1},8,["feature-name","help-url","inline-help"])])):Object(o["createCommentVNode"])("",!0),Object(o["createElementVNode"])("div",ft,[Object(o["renderSlot"])(e.$slots,"default")],512)])],512)}var gt=null,ht=Object(o["defineComponent"])({props:{contentTitle:String,feature:String,helpUrl:String,helpText:String,anchor:String},components:{EnrichedHeadline:ct},data:function(){return{actualFeature:this.feature,actualHelpText:this.helpText}},watch:{feature:function(e){this.actualFeature=e},helpText:function(e){this.actualHelpText=e}},mounted:function(){var e,t=this,n=this.$refs,r=n.root,a=n.content;if(this.anchor){var o=document.createElement("a");o.id=this.anchor,r.parentElement.prepend(o)}if(setTimeout((function(){var e=a.querySelector(".contentHelp");e&&(t.actualHelpText=e.innerHTML,e.remove())}),0),!this.actualFeature||!0!==this.actualFeature&&"true"!==this.actualFeature||(this.actualFeature=this.contentTitle),null===gt&&(gt=document.querySelector("#content.admin")),gt&&(e=gt.offsetTop),e||0===e){var i=r.closest("[piwik-widget-loader]"),s=i?i.offsetTop:r.offsetTop;s-e<17&&(r.style.marginTop=0)}}});ht.render=mt;var vt=ht;
+ */var Zt=8,en=3;function tn(e){return e?e instanceof Array?e:[e]:[]}var nn=function(){function e(){var t=this;Yt(this,e),Xt(this,"privateState",Object(o["reactive"])({comparisonsDisabledFor:[]})),Xt(this,"state",Object(o["readonly"])(this.privateState)),Xt(this,"colors",{}),Xt(this,"segmentComparisons",Object(o["computed"])((function(){return t.parseSegmentComparisons()}))),Xt(this,"periodComparisons",Object(o["computed"])((function(){return t.parsePeriodComparisons()}))),Xt(this,"isEnabled",Object(o["computed"])((function(){return t.checkEnabledForCurrentPage()}))),this.loadComparisonsDisabledFor(),$((function(){t.colors=t.getAllSeriesColors()})),Object(o["watch"])((function(){return t.getComparisons()}),(function(){return j.postEvent("piwikComparisonsChanged")}),{deep:!0})}return Kt(e,[{key:"getComparisons",value:function(){return this.getSegmentComparisons().concat(this.getPeriodComparisons())}},{key:"isComparing",value:function(){return this.isComparisonEnabled()&&(this.segmentComparisons.value.length>1||this.periodComparisons.value.length>1)}},{key:"isComparingPeriods",value:function(){return this.getPeriodComparisons().length>1}},{key:"getSegmentComparisons",value:function(){return this.isComparisonEnabled()?this.segmentComparisons.value:[]}},{key:"getPeriodComparisons",value:function(){return this.isComparisonEnabled()?this.periodComparisons.value:[]}},{key:"getSeriesColor",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,r=this.getComparisonSeriesIndex(t.index,e.index)%Zt;if(0===n)return this.colors["series".concat(r)];var a=n%en;return this.colors["series".concat(r,"-shade").concat(a)]}},{key:"getSeriesColorName",value:function(e,t){var n="series".concat(e%Zt);return t>0&&(n+="-shade".concat(t%en)),n}},{key:"isComparisonEnabled",value:function(){return this.isEnabled.value}},{key:"getIndividualComparisonRowIndices",value:function(e){var t=this.getSegmentComparisons().length,n=e%t,r=Math.floor(e/t);return{segmentIndex:n,periodIndex:r}}},{key:"getComparisonSeriesIndex",value:function(e,t){var n=this.getSegmentComparisons().length;return e*n+t}},{key:"getAllComparisonSeries",value:function(){var e=this,t=[],n=0;return this.getPeriodComparisons().forEach((function(r){e.getSegmentComparisons().forEach((function(a){t.push({index:n,params:zt(zt({},a.params),r.params),color:e.colors["series".concat(n)]}),n+=1}))})),t}},{key:"removeSegmentComparison",value:function(e){if(!this.isComparisonEnabled())throw new Error("Comparison disabled.");var t=Lt(this.segmentComparisons.value);t.splice(e,1);var n={};0===e&&(n.segment=t[0].params.segment),this.updateQueryParamsFromComparisons(t,this.periodComparisons.value,n)}},{key:"addSegmentComparison",value:function(e){if(!this.isComparisonEnabled())throw new Error("Comparison disabled.");var t=this.segmentComparisons.value.concat([{params:e,index:-1,title:""}]);this.updateQueryParamsFromComparisons(t,this.periodComparisons.value)}},{key:"updateQueryParamsFromComparisons",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r={},a={},o=!1,i=!1;e.forEach((function(e){o?r[e.params.segment]=!0:o=!0})),t.forEach((function(e){i?a["".concat(e.params.period,"|").concat(e.params.date)]=!0:i=!0}));var l=[],s=[];Object.keys(a).forEach((function(e){var t=e.split("|");l.push(t[0]),s.push(t[1])}));var c={compareSegments:Object.keys(r),comparePeriods:l,compareDates:s};if(j.helper.isAngularRenderingThePage()){var u=ke.hashParsed.value,d=zt(zt(zt({},u),c),n);return delete d["compareSegments[]"],delete d["comparePeriods[]"],delete d["compareDates[]"],void(JSON.stringify(d)!==JSON.stringify(u)&&ke.updateHash(d))}var p=[];["compareSegments","comparePeriods","compareDates"].forEach((function(e){c[e].length||p.push(e)}));var f=ke.stringify(n),m=ke.stringify(c);window.broadcast.propagateNewPage(f,void 0,m,p)}},{key:"getAllSeriesColors",value:function(){for(var e=j.ColorManager,t=[],n=0;n<Zt;n+=1){t.push("series".concat(n));for(var r=0;r<en;r+=1)t.push("series".concat(n,"-shade").concat(r))}return e.getColors("comparison-series-color",t)}},{key:"loadComparisonsDisabledFor",value:function(){var e=this;He.fetch({module:"API",method:"API.getPagesComparisonsDisabledFor"}).then((function(t){e.privateState.comparisonsDisabledFor=t}))}},{key:"parseSegmentComparisons",value:function(){var e=Vt.state.availableSegments,t=Lt(tn(ke.parsed.value.compareSegments));t.unshift(ke.parsed.value.segment||"");var n=[];return t.forEach((function(t,r){var a;e.forEach((function(e){e.definition!==t&&e.definition!==decodeURIComponent(t)&&decodeURIComponent(e.definition)!==t||(a=e)}));var o=a?a.name:P("General_Unknown");""===t.trim()&&(o=P("SegmentEditor_DefaultAllVisits")),n.push({params:{segment:t},title:j.helper.htmlDecode(o),index:r})})),n}},{key:"parsePeriodComparisons",value:function(){var e=Lt(tn(ke.parsed.value.comparePeriods)),t=Lt(tn(ke.parsed.value.compareDates));e.unshift(ke.parsed.value.period),t.unshift(ke.parsed.value.date);for(var n=[],r=0;r<Math.min(t.length,e.length);r+=1){var a=void 0;try{a=p.parse(e[r],t[r]).getPrettyString()}catch(o){a=P("General_Error")}n.push({params:{date:t[r],period:e[r]},title:a,index:r})}return n}},{key:"checkEnabledForCurrentPage",value:function(){var e=ke.parsed.value.category||ke.parsed.value.module,t=ke.parsed.value.subcategory||ke.parsed.value.action,n="".concat(e,".").concat(t),r=-1===this.privateState.comparisonsDisabledFor.indexOf(n)&&-1===this.privateState.comparisonsDisabledFor.indexOf("".concat(e,".*"));return document.documentElement.classList.toggle("comparisonsDisabled",!r),r}}]),e}(),rn=new nn,an={key:0,ref:"root",class:"matomo-comparisons"},on={class:"comparison-type"},ln=["title"],sn=["href"],cn=["title"],un={class:"comparison-period-label"},dn=["onClick"],pn=["title"],fn={class:"loadingPiwik",style:{display:"none"}},mn=["alt"];function hn(e,t,n,r,a,i){return e.isComparing?(Object(o["openBlock"])(),Object(o["createElementBlock"])("div",an,[Object(o["createElementVNode"])("h3",null,Object(o["toDisplayString"])(e.translate("General_Comparisons")),1),(Object(o["openBlock"])(!0),Object(o["createElementBlock"])(o["Fragment"],null,Object(o["renderList"])(e.segmentComparisons,(function(t,n){return Object(o["openBlock"])(),Object(o["createElementBlock"])("div",{class:"comparison card",key:t.index},[Object(o["createElementVNode"])("div",on,Object(o["toDisplayString"])(e.translate("General_Segment")),1),Object(o["createElementVNode"])("div",{class:"title",title:t.title+"<br/>"+decodeURIComponent(t.params.segment)},[Object(o["createElementVNode"])("a",{target:"_blank",href:e.getUrlToSegment(t.params.segment)},Object(o["toDisplayString"])(t.title),9,sn)],8,ln),(Object(o["openBlock"])(!0),Object(o["createElementBlock"])(o["Fragment"],null,Object(o["renderList"])(e.periodComparisons,(function(n){return Object(o["openBlock"])(),Object(o["createElementBlock"])("div",{class:"comparison-period",key:n.index,title:e.getComparisonTooltip(t,n)},[Object(o["createElementVNode"])("span",{class:"comparison-dot",style:Object(o["normalizeStyle"])({"background-color":e.getSeriesColor(t,n)})},null,4),Object(o["createElementVNode"])("span",un,Object(o["toDisplayString"])(n.title)+" ("+Object(o["toDisplayString"])(e.getComparisonPeriodType(n))+") ",1)],8,cn)})),128)),e.segmentComparisons.length>1?(Object(o["openBlock"])(),Object(o["createElementBlock"])("a",{key:0,class:"remove-button",onClick:function(t){return e.removeSegmentComparison(n)}},[Object(o["createElementVNode"])("span",{class:"icon icon-close",title:e.translate("General_ClickToRemoveComp")},null,8,pn)],8,dn)):Object(o["createCommentVNode"])("",!0)])})),128)),Object(o["createElementVNode"])("div",fn,[Object(o["createElementVNode"])("img",{src:"plugins/Morpheus/images/loading-blue.gif",alt:e.translate("General_LoadingData")},null,8,mn),Object(o["createTextVNode"])(" "+Object(o["toDisplayString"])(e.translate("General_LoadingData")),1)])],512)):Object(o["createCommentVNode"])("",!0)}function gn(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function vn(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?gn(Object(n),!0).forEach((function(t){bn(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):gn(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function bn(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var yn=Object(o["defineComponent"])({props:{},data:function(){return{comparisonTooltips:null}},setup:function(){var e=Object(o["computed"])((function(){return rn.isComparing()})),t=Object(o["computed"])((function(){return rn.getSegmentComparisons()})),n=Object(o["computed"])((function(){return rn.getPeriodComparisons()})),r=rn.getSeriesColor.bind(rn);return{isComparing:e,segmentComparisons:t,periodComparisons:n,getSeriesColor:r}},methods:{comparisonHasSegment:function(e){return"undefined"!==typeof e.params.segment},removeSegmentComparison:function(e){window.$(this.$refs.root).tooltip("destroy"),rn.removeSegmentComparison(e)},getComparisonPeriodType:function(e){var t=e.params.period;if("range"===t)return P("CoreHome_PeriodRange");var n=P("Intl_Period".concat(t.substring(0,1).toUpperCase()).concat(t.substring(1)));return n.substring(0,1).toUpperCase()+n.substring(1)},getComparisonTooltip:function(e,t){if(this.comparisonTooltips&&Object.keys(this.comparisonTooltips).length)return(this.comparisonTooltips[t.index]||{})[e.index]},getUrlToSegment:function(e){var t=vn({},ke.hashParsed.value);return delete t.comparePeriods,delete t.compareDates,delete t.compareSegments,t.segment=e,"".concat(window.location.search,"#?").concat(ke.stringify(t))},setUpTooltips:function(){var e=window,t=e.$;t(this.$refs.root).tooltip({track:!0,content:function(){var e=t(this).attr("title");return window.vueSanitize(e.replace(/\n/g,"<br />"))},show:{delay:200,duration:200},hide:!1})},onComparisonsChanged:function(){var e=this;if(this.comparisonTooltips=null,rn.isComparing()){var t=rn.getPeriodComparisons(),n=rn.getSegmentComparisons();He.fetch({method:"API.getProcessedReport",apiModule:"VisitsSummary",apiAction:"get",compare:"1",compareSegments:ke.getSearchParam("compareSegments"),comparePeriods:ke.getSearchParam("comparePeriods"),compareDates:ke.getSearchParam("compareDates"),format_metrics:"1"}).then((function(r){e.comparisonTooltips={},t.forEach((function(t){e.comparisonTooltips[t.index]={},n.forEach((function(n){var a=e.generateComparisonTooltip(r,t,n);e.comparisonTooltips[t.index][n.index]=a}))}))}))}},generateComparisonTooltip:function(e,t,n){if(!e.reportData.comparisons)return"";var r=rn.getComparisonSeriesIndex(t.index,0),a=e.reportData.comparisons[r],o=rn.getComparisonSeriesIndex(t.index,n.index),i=e.reportData.comparisons[o],l=e.reportData.comparisons[n.index],s='<div class="comparison-card-tooltip">',c=(i.nb_visits/a.nb_visits*100).toFixed(2);return c="".concat(c,"%"),s+=P("General_ComparisonCardTooltip1",["'".concat(i.compareSegmentPretty,"'"),i.comparePeriodPretty,c,i.nb_visits.toString(),a.nb_visits.toString()]),t.index>0&&(s+="<br/><br/>",s+=P("General_ComparisonCardTooltip2",[i.nb_visits_change.toString(),l.compareSegmentPretty,l.comparePeriodPretty])),s+="</div>",s}},updated:function(){var e=this;setTimeout((function(){return e.setUpTooltips()}))},mounted:function(){var e=this;j.on("piwikComparisonsChanged",(function(){e.onComparisonsChanged()})),this.onComparisonsChanged(),setTimeout((function(){return e.setUpTooltips()}))},beforeUnmount:function(){try{window.$(this.refs.root).tooltip("destroy")}catch(e){}}});yn.render=hn;var wn=yn;
/*!
* Matomo - free/libre analytics platform
*
* @link https://matomo.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- */Le({component:vt,scope:{contentTitle:{angularJsBind:"@"},feature:{angularJsBind:"@"},helpUrl:{angularJsBind:"@"},helpText:{angularJsBind:"@"},anchor:{angularJsBind:"@?"}},directiveName:"piwikContentBlock",transclude:!0});function bt(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function yt(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function wt(e,t,n){return t&&yt(e.prototype,t),n&&yt(e,n),e}function kt(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}
+ */function kn(){return rn}kn.$inject=[],angular.module("piwikApp.service").factory("piwikComparisonsService",kn);st({component:wn,directiveName:"piwikComparisons",restrict:"E"});var Dn={ref:"root"};function On(e,t,n,r,a,i){return Object(o["openBlock"])(),Object(o["createElementBlock"])("div",Dn,null,512)}function jn(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function Pn(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?jn(Object(n),!0).forEach((function(t){Cn(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):jn(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function Cn(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var Sn=1,En=window,Tn=En.$,xn=Object(o["defineComponent"])({props:{selectedDateStart:Date,selectedDateEnd:Date,highlightedDateStart:Date,highlightedDateEnd:Date,viewDate:[String,Date],stepMonths:Number,disableMonthDropdown:Boolean,options:Object},emits:["cellHover","cellHoverLeave","dateSelect"],setup:function(e,t){var n=Object(o["ref"])(null);function r(t,n){var r=t.children("a");if(e.selectedDateStart&&e.selectedDateEnd&&n>=e.selectedDateStart&&n<=e.selectedDateEnd?t.addClass("ui-datepicker-current-period"):t.removeClass("ui-datepicker-current-period"),e.highlightedDateStart&&e.highlightedDateEnd&&n>=e.highlightedDateStart&&n<=e.highlightedDateEnd){var a=r.length?r:t;a.addClass("ui-state-hover")}else t.removeClass("ui-state-hover"),r.removeClass("ui-state-hover")}function a(e,t,n){if(e.hasClass("ui-datepicker-other-month"))return i(e,t,n);var r=parseInt(e.children("a,span").text(),10);return new Date(n,t,r)}function i(e,t,n){var r,o=e.parent(),i=o.children("td");if(o.is(":first-child")){var l=o.children("td:not(.ui-datepicker-other-month)").first();return r=a(l,t,n),r.setDate(i.index(e)-i.index(l)+1),r}var s=o.children("td:not(.ui-datepicker-other-month)").last();return r=a(s,t,n),r.setDate(r.getDate()+i.index(e)-i.index(s)),r}function l(){var e=Tn(n.value),t=e.find("td[data-month]"),r=parseInt(t.attr("data-month"),10),a=parseInt(t.attr("data-year"),10);return[r,a]}function s(){var e=Tn(n.value),t=e.find(".ui-datepicker-calendar"),o=l(),i=t.find("td"),s=i.first(),c=a(s,o[0],o[1]);i.each((function(){r(Tn(this),c),c.setDate(c.getDate()+1)}))}function c(){var t=e.viewDate;if(!t)return!1;if(!(t instanceof Date))try{t=E(t)}catch(o){return!1}var r=Tn(n.value),a=l();return(a[0]!==t.getMonth()||a[1]!==t.getFullYear())&&(r.datepicker("setDate",t),!0)}function u(){var e=Tn(n.value);e.find("td[data-event]").off("click"),e.find(".ui-state-active").removeClass("ui-state-active"),e.find(".ui-datepicker-current-day").removeClass("ui-datepicker-current-day"),e.find(".ui-datepicker-prev,.ui-datepicker-next").attr("href","")}function d(){var t=Tn(n.value),r=e.stepMonths||Sn;if(t.datepicker("option","stepMonths")===r)return!1;var a=Tn(".ui-datepicker-month",t).val(),o=Tn(".ui-datepicker-year",t).val();return t.datepicker("option","stepMonths",r).datepicker("setDate",new Date(o,a)),u(),!0}function p(){var t=Tn(n.value);t.find(".ui-datepicker-month").attr("disabled",e.disableMonthDropdown)}function f(){if(Tn(this).hasClass("ui-state-hover")){var e=Tn(this).parent(),t=e.parent();e.is(":first-child")?t.find("a").first().click():t.find("a").last().click()}}function m(){p(),s()}return Object(o["watch"])((function(){return Pn({},e)}),(function(e,t){var n=!1;["selectedDateStart","selectedDateEnd","highlightedDateStart","highlightedDateEnd"].forEach((function(r){n||(!e[r]&&t[r]&&(n=!0),e[r]&&!t[r]&&(n=!0),e[r]&&t[r]&&e[r].getTime()!==t[r].getTime()&&(n=!0))})),e.viewDate!==t.viewDate&&c()&&(n=!0),e.stepMonths!==t.stepMonths&&d(),e.enableDisableMonthDropdown!==t.enableDisableMonthDropdown&&p(),n&&s()})),Object(o["onMounted"])((function(){var r=Tn(n.value),o=e.options||{},i=Pn(Pn(Pn({},j.getBaseDatePickerOptions()),o),{},{onChangeMonthYear:function(){setTimeout((function(){u()}))}});r.datepicker(i),r.on("mouseover","tbody td a",(function(e){e.originalEvent&&s()})),r.on("mouseenter","tbody td",(function(){var e=l(),n=Tn(this),r=a(n,e[0],e[1]);t.emit("cellHover",{date:r,$cell:n})})),r.on("mouseout","tbody td a",(function(){s()})),r.on("mouseleave","table",(function(){return t.emit("cellHoverLeave")})).on("mouseenter","thead",(function(){return t.emit("cellHoverLeave")})),r.on("click","tbody td.ui-datepicker-other-month",(function(){return f()})),r.on("click",(function(e){e.preventDefault();var t=Tn(e.target).closest("a");(t.is(".ui-datepicker-next")||t.is(".ui-datepicker-prev"))&&m()})),r.on("click","td[data-month]",(function(e){var n=Tn(e.target).closest("td"),r=parseInt(n.attr("data-month"),10),a=parseInt(n.attr("data-year"),10),o=parseInt(n.children("a,span").text(),10);t.emit("dateSelect",{date:new Date(a,r,o)})}));var h=d();c(),p(),h||u(),s()})),{root:n}}});xn.render=On;var In=xn,Hn=(st({component:In,scope:{selectedDateStart:{angularJsBind:"<"},selectedDateEnd:{angularJsBind:"<"},highlightedDateStart:{angularJsBind:"<"},highlightedDateEnd:{angularJsBind:"<"},viewDate:{angularJsBind:"<"},stepMonths:{angularJsBind:"<"},disableMonthDropdown:{angularJsBind:"<"},options:{angularJsBind:"<"},cellHover:{angularJsBind:"&"},cellHoverLeave:{angularJsBind:"&"},dateSelect:{angularJsBind:"&"}},directiveName:"piwikDatePicker",events:{"cell-hover":function(e,t,n,r,a){a()},"cell-hover-leave":function(e,t,n,r,a){a()},"date-select":function(e,t,n,r,a){a()}},$inject:["$timeout"]}),{id:"calendarRangeFrom"}),An={id:"calendarRangeTo"};
/*!
* Matomo - free/libre analytics platform
*
* @link https://matomo.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- */var Ot=function(){function e(){var t=this;bt(this,e),kt(this,"segmentState",Object(o["reactive"])({availableSegments:[]})),P.on("piwikSegmentationInited",(function(){return t.setSegmentState()}))}return wt(e,[{key:"state",get:function(){return Object(o["readonly"])(this.segmentState)}},{key:"setSegmentState",value:function(){try{var e=$(".segmentEditorPanel").data("uiControlObject");this.segmentState.availableSegments=e.impl.availableSegments||[]}catch(t){}}}]),e}(),jt=new Ot;function Pt(e){return Et(e)||Dt(e)||St(e)||Ct()}function Ct(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function St(e,t){if(e){if("string"===typeof e)return Tt(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?Tt(e,t):void 0}}function Dt(e){if("undefined"!==typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}function Et(e){if(Array.isArray(e))return Tt(e)}function Tt(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function It(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function xt(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?It(Object(n),!0).forEach((function(t){Nt(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):It(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function At(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function $t(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function Ht(e,t,n){return t&&$t(e.prototype,t),n&&$t(e,n),e}function Nt(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}
+ */function $n(e,t,n,r,a,i){var l=Object(o["resolveComponent"])("DatePicker");return Object(o["openBlock"])(),Object(o["createElementBlock"])(o["Fragment"],null,[Object(o["createElementVNode"])("div",Hn,[Object(o["createElementVNode"])("h6",null,[Object(o["createTextVNode"])(Object(o["toDisplayString"])(e.translate("General_DateRangeFrom"))+" ",1),Object(o["withDirectives"])(Object(o["createElementVNode"])("input",{type:"text",id:"inputCalendarFrom",name:"inputCalendarFrom",class:"browser-default","onUpdate:modelValue":t[0]||(t[0]=function(t){return e.startDateText=t}),onChange:t[1]||(t[1]=function(t){return e.onRangeInputChanged("from",t)}),onKeyup:t[2]||(t[2]=function(t){return e.handleEnterPress(t)})},null,544),[[o["vModelText"],e.startDateText]])]),Object(o["createVNode"])(l,{id:"calendarFrom","view-date":e.startDate,"selected-date-start":e.fromPickerSelectedDates[0],"selected-date-end":e.fromPickerSelectedDates[1],"highlighted-date-start":e.fromPickerHighlightedDates[0],"highlighted-date-end":e.fromPickerHighlightedDates[1],onDateSelect:t[3]||(t[3]=function(t){return e.setStartRangeDate(t.date)}),onCellHover:t[4]||(t[4]=function(t){return e.fromPickerHighlightedDates=e.getNewHighlightedDates(t.date,t.$cell)}),onCellHoverLeave:t[5]||(t[5]=function(t){return e.fromPickerHighlightedDates=[null,null]})},null,8,["view-date","selected-date-start","selected-date-end","highlighted-date-start","highlighted-date-end"])]),Object(o["createElementVNode"])("div",An,[Object(o["createElementVNode"])("h6",null,[Object(o["createTextVNode"])(Object(o["toDisplayString"])(e.translate("General_DateRangeTo"))+" ",1),Object(o["withDirectives"])(Object(o["createElementVNode"])("input",{type:"text",id:"inputCalendarTo",name:"inputCalendarTo",class:"browser-default","onUpdate:modelValue":t[6]||(t[6]=function(t){return e.endDateText=t}),onChange:t[7]||(t[7]=function(t){return e.onRangeInputChanged("to",t)}),onKeyup:t[8]||(t[8]=function(t){return e.handleEnterPress(t)})},null,544),[[o["vModelText"],e.endDateText]])]),Object(o["createVNode"])(l,{id:"calendarTo","view-date":e.endDate,"selected-date-start":e.toPickerSelectedDates[0],"selected-date-end":e.toPickerSelectedDates[1],"highlighted-date-start":e.toPickerHighlightedDates[0],"highlighted-date-end":e.toPickerHighlightedDates[1],onDateSelect:t[9]||(t[9]=function(t){return e.setEndRangeDate(t.date)}),onCellHover:t[10]||(t[10]=function(t){return e.toPickerHighlightedDates=e.getNewHighlightedDates(t.date,t.$cell)}),onCellHoverLeave:t[11]||(t[11]=function(t){return e.toPickerHighlightedDates=[null,null]})},null,8,["view-date","selected-date-start","selected-date-end","highlighted-date-start","highlighted-date-end"])])],64)}var Bn=Object(o["defineComponent"])({props:{startDate:String,endDate:String},components:{DatePicker:In},data:function(){var e=null;try{e=E(this.startDate)}catch(n){}var t=null;try{t=E(this.endDate)}catch(n){}return{fromPickerSelectedDates:[e,e],toPickerSelectedDates:[t,t],fromPickerHighlightedDates:[null,null],toPickerHighlightedDates:[null,null],startDateText:this.startDate,endDateText:this.endDate}},emits:["rangeChange","submit"],watch:{startDate:function(){this.startDateText=this.startDate,this.setStartRangeDateFromStr(this.startDate)},endDate:function(){this.endDateText=this.endDate,this.setEndRangeDateFromStr(this.endDate)}},mounted:function(){this.rangeChanged()},methods:{setStartRangeDate:function(e){this.fromPickerSelectedDates=[e,e],this.rangeChanged()},setEndRangeDate:function(e){this.toPickerSelectedDates=[e,e],this.rangeChanged()},onRangeInputChanged:function(e,t){"from"===e?this.setStartRangeDateFromStr(t.target.value):this.setEndRangeDateFromStr(t.target.value)},getNewHighlightedDates:function(e,t){return t.hasClass("ui-datepicker-unselectable")?null:[e,e]},handleEnterPress:function(e){13===e.keyCode&&this.$emit("submit",{start:this.startDate,end:this.endDate})},setStartRangeDateFromStr:function(e){var t;try{t=E(e)}catch(n){this.startDateText=this.startDate}t&&(this.fromPickerSelectedDates=[t,t]),this.rangeChanged()},setEndRangeDateFromStr:function(e){var t;try{t=E(e)}catch(n){this.endDateText=this.endDate}t&&(this.toPickerSelectedDates=[t,t]),this.rangeChanged()},rangeChanged:function(){this.$emit("rangeChange",{start:C(this.fromPickerSelectedDates[0]),end:C(this.toPickerSelectedDates[0])})}}});Bn.render=$n;var Nn=Bn;
/*!
* Matomo - free/libre analytics platform
*
* @link https://matomo.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- */var Ft=8,Bt=3;function Ut(e){return e?e instanceof Array?e:[e]:[]}var Rt=function(){function e(){var t=this;At(this,e),Nt(this,"privateState",Object(o["reactive"])({comparisonsDisabledFor:[]})),Nt(this,"state",Object(o["readonly"])(this.privateState)),Nt(this,"colors",{}),Nt(this,"segmentComparisons",Object(o["computed"])((function(){return t.parseSegmentComparisons()}))),Nt(this,"periodComparisons",Object(o["computed"])((function(){return t.parsePeriodComparisons()}))),Nt(this,"isEnabled",Object(o["computed"])((function(){return t.checkEnabledForCurrentPage()}))),this.loadComparisonsDisabledFor(),$((function(){t.colors=t.getAllSeriesColors()})),Object(o["watch"])((function(){return t.getComparisons()}),(function(){return P.postEvent("piwikComparisonsChanged")}),{deep:!0})}return Ht(e,[{key:"getComparisons",value:function(){return this.getSegmentComparisons().concat(this.getPeriodComparisons())}},{key:"isComparing",value:function(){return this.isComparisonEnabled()&&(this.segmentComparisons.value.length>1||this.periodComparisons.value.length>1)}},{key:"isComparingPeriods",value:function(){return this.getPeriodComparisons().length>1}},{key:"getSegmentComparisons",value:function(){return this.isComparisonEnabled()?this.segmentComparisons.value:[]}},{key:"getPeriodComparisons",value:function(){return this.isComparisonEnabled()?this.periodComparisons.value:[]}},{key:"getSeriesColor",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,r=this.getComparisonSeriesIndex(t.index,e.index)%Ft;if(0===n)return this.colors["series".concat(r)];var a=n%Bt;return this.colors["series".concat(r,"-shade").concat(a)]}},{key:"getSeriesColorName",value:function(e,t){var n="series".concat(e%Ft);return t>0&&(n+="-shade".concat(t%Bt)),n}},{key:"isComparisonEnabled",value:function(){return this.isEnabled.value}},{key:"getIndividualComparisonRowIndices",value:function(e){var t=this.getSegmentComparisons().length,n=e%t,r=Math.floor(e/t);return{segmentIndex:n,periodIndex:r}}},{key:"getComparisonSeriesIndex",value:function(e,t){var n=this.getSegmentComparisons().length;return e*n+t}},{key:"getAllComparisonSeries",value:function(){var e=this,t=[],n=0;return this.getPeriodComparisons().forEach((function(r){e.getSegmentComparisons().forEach((function(a){t.push({index:n,params:xt(xt({},a.params),r.params),color:e.colors["series".concat(n)]}),n+=1}))})),t}},{key:"removeSegmentComparison",value:function(e){if(!this.isComparisonEnabled())throw new Error("Comparison disabled.");var t=Pt(this.segmentComparisons.value);t.splice(e,1);var n={};0===e&&(n.segment=t[0].params.segment),this.updateQueryParamsFromComparisons(t,this.periodComparisons.value,n)}},{key:"addSegmentComparison",value:function(e){if(!this.isComparisonEnabled())throw new Error("Comparison disabled.");var t=this.segmentComparisons.value.concat([{params:e,index:-1,title:""}]);this.updateQueryParamsFromComparisons(t,this.periodComparisons.value)}},{key:"updateQueryParamsFromComparisons",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r={},a={},o=!1,i=!1;e.forEach((function(e){o?r[e.params.segment]=!0:o=!0})),t.forEach((function(e){i?a["".concat(e.params.period,"|").concat(e.params.date)]=!0:i=!0}));var s=[],c=[];Object.keys(a).forEach((function(e){var t=e.split("|");s.push(t[0]),c.push(t[1])}));var l={compareSegments:Object.keys(r),comparePeriods:s,compareDates:c};if(P.helper.isAngularRenderingThePage()){var u=ke.hashParsed.value,d=xt(xt(xt({},u),l),n);return delete d["compareSegments[]"],delete d["comparePeriods[]"],delete d["compareDates[]"],void(JSON.stringify(d)!==JSON.stringify(u)&&ke.updateHash(d))}var p=[];["compareSegments","comparePeriods","compareDates"].forEach((function(e){l[e].length||p.push(e)}));var f=ke.stringify(n),m=ke.stringify(l);window.broadcast.propagateNewPage(f,void 0,m,p)}},{key:"getAllSeriesColors",value:function(){for(var e=P.ColorManager,t=[],n=0;n<Ft;n+=1){t.push("series".concat(n));for(var r=0;r<Bt;r+=1)t.push("series".concat(n,"-shade").concat(r))}return e.getColors("comparison-series-color",t)}},{key:"loadComparisonsDisabledFor",value:function(){var e=this;Ae.fetch({module:"API",method:"API.getPagesComparisonsDisabledFor"}).then((function(t){e.privateState.comparisonsDisabledFor=t}))}},{key:"parseSegmentComparisons",value:function(){var e=jt.state.availableSegments,t=Pt(Ut(ke.parsed.value.compareSegments));t.unshift(ke.parsed.value.segment||"");var n=[];return t.forEach((function(t,r){var a;e.forEach((function(e){e.definition!==t&&e.definition!==decodeURIComponent(t)&&decodeURIComponent(e.definition)!==t||(a=e)}));var o=a?a.name:C("General_Unknown");""===t.trim()&&(o=C("SegmentEditor_DefaultAllVisits")),n.push({params:{segment:t},title:P.helper.htmlDecode(o),index:r})})),n}},{key:"parsePeriodComparisons",value:function(){var e=Pt(Ut(ke.parsed.value.comparePeriods)),t=Pt(Ut(ke.parsed.value.compareDates));e.unshift(ke.parsed.value.period),t.unshift(ke.parsed.value.date);for(var n=[],r=0;r<Math.min(t.length,e.length);r+=1){var a=void 0;try{a=p.parse(e[r],t[r]).getPrettyString()}catch(o){a=C("General_Error")}n.push({params:{date:t[r],period:e[r]},title:a,index:r})}return n}},{key:"checkEnabledForCurrentPage",value:function(){var e=ke.parsed.value.category||ke.parsed.value.module,t=ke.parsed.value.subcategory||ke.parsed.value.action,n="".concat(e,".").concat(t),r=-1===this.privateState.comparisonsDisabledFor.indexOf(n)&&-1===this.privateState.comparisonsDisabledFor.indexOf("".concat(e,".*"));return document.documentElement.classList.toggle("comparisonsDisabled",!r),r}}]),e}(),_t=new Rt,Vt={key:0,ref:"root",class:"matomo-comparisons"},Mt={class:"comparison-type"},qt=["title"],Gt=["href"],Lt=["title"],Qt={class:"comparison-period-label"},Jt=["onClick"],zt=["title"],Yt={class:"loadingPiwik",style:{display:"none"}},Wt=["alt"];function Xt(e,t,n,r,a,i){return e.isComparing?(Object(o["openBlock"])(),Object(o["createElementBlock"])("div",Vt,[Object(o["createElementVNode"])("h3",null,Object(o["toDisplayString"])(e.translate("General_Comparisons")),1),(Object(o["openBlock"])(!0),Object(o["createElementBlock"])(o["Fragment"],null,Object(o["renderList"])(e.segmentComparisons,(function(t,n){return Object(o["openBlock"])(),Object(o["createElementBlock"])("div",{class:"comparison card",key:t.index},[Object(o["createElementVNode"])("div",Mt,Object(o["toDisplayString"])(e.translate("General_Segment")),1),Object(o["createElementVNode"])("div",{class:"title",title:t.title+"<br/>"+decodeURIComponent(t.params.segment)},[Object(o["createElementVNode"])("a",{target:"_blank",href:e.getUrlToSegment(t.params.segment)},Object(o["toDisplayString"])(t.title),9,Gt)],8,qt),(Object(o["openBlock"])(!0),Object(o["createElementBlock"])(o["Fragment"],null,Object(o["renderList"])(e.periodComparisons,(function(n){return Object(o["openBlock"])(),Object(o["createElementBlock"])("div",{class:"comparison-period",key:n.index,title:e.getComparisonTooltip(t,n)},[Object(o["createElementVNode"])("span",{class:"comparison-dot",style:Object(o["normalizeStyle"])({"background-color":e.getSeriesColor(t,n)})},null,4),Object(o["createElementVNode"])("span",Qt,Object(o["toDisplayString"])(n.title)+" ("+Object(o["toDisplayString"])(e.getComparisonPeriodType(n))+") ",1)],8,Lt)})),128)),e.segmentComparisons.length>1?(Object(o["openBlock"])(),Object(o["createElementBlock"])("a",{key:0,class:"remove-button",onClick:function(t){return e.removeSegmentComparison(n)}},[Object(o["createElementVNode"])("span",{class:"icon icon-close",title:e.translate("General_ClickToRemoveComp")},null,8,zt)],8,Jt)):Object(o["createCommentVNode"])("",!0)])})),128)),Object(o["createElementVNode"])("div",Yt,[Object(o["createElementVNode"])("img",{src:"plugins/Morpheus/images/loading-blue.gif",alt:e.translate("General_LoadingData")},null,8,Wt),Object(o["createTextVNode"])(" "+Object(o["toDisplayString"])(e.translate("General_LoadingData")),1)])],512)):Object(o["createCommentVNode"])("",!0)}function Kt(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function Zt(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?Kt(Object(n),!0).forEach((function(t){en(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):Kt(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function en(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var tn=Object(o["defineComponent"])({props:{},data:function(){return{comparisonTooltips:null}},setup:function(){var e=Object(o["computed"])((function(){return _t.isComparing()})),t=Object(o["computed"])((function(){return _t.getSegmentComparisons()})),n=Object(o["computed"])((function(){return _t.getPeriodComparisons()})),r=_t.getSeriesColor.bind(_t);return{isComparing:e,segmentComparisons:t,periodComparisons:n,getSeriesColor:r}},methods:{comparisonHasSegment:function(e){return"undefined"!==typeof e.params.segment},removeSegmentComparison:function(e){window.$(this.$refs.root).tooltip("destroy"),_t.removeSegmentComparison(e)},getComparisonPeriodType:function(e){var t=e.params.period;if("range"===t)return C("CoreHome_PeriodRange");var n=C("Intl_Period".concat(t.substring(0,1).toUpperCase()).concat(t.substring(1)));return n.substring(0,1).toUpperCase()+n.substring(1)},getComparisonTooltip:function(e,t){if(this.comparisonTooltips&&Object.keys(this.comparisonTooltips).length)return(this.comparisonTooltips[t.index]||{})[e.index]},getUrlToSegment:function(e){var t=Zt({},ke.hashParsed.value);return delete t.comparePeriods,delete t.compareDates,delete t.compareSegments,t.segment=e,"".concat(window.location.search,"#?").concat(ke.stringify(t))},setUpTooltips:function(){var e=window,t=e.$;t(this.$refs.root).tooltip({track:!0,content:function(){var e=t(this).attr("title");return window.vueSanitize(e.replace(/\n/g,"<br />"))},show:{delay:200,duration:200},hide:!1})},onComparisonsChanged:function(){var e=this;if(this.comparisonTooltips=null,_t.isComparing()){var t=_t.getPeriodComparisons(),n=_t.getSegmentComparisons();Ae.fetch({method:"API.getProcessedReport",apiModule:"VisitsSummary",apiAction:"get",compare:"1",compareSegments:ke.getSearchParam("compareSegments"),comparePeriods:ke.getSearchParam("comparePeriods"),compareDates:ke.getSearchParam("compareDates"),format_metrics:"1"}).then((function(r){e.comparisonTooltips={},t.forEach((function(t){e.comparisonTooltips[t.index]={},n.forEach((function(n){var a=e.generateComparisonTooltip(r,t,n);e.comparisonTooltips[t.index][n.index]=a}))}))}))}},generateComparisonTooltip:function(e,t,n){if(!e.reportData.comparisons)return"";var r=_t.getComparisonSeriesIndex(t.index,0),a=e.reportData.comparisons[r],o=_t.getComparisonSeriesIndex(t.index,n.index),i=e.reportData.comparisons[o],s=e.reportData.comparisons[n.index],c='<div class="comparison-card-tooltip">',l=(i.nb_visits/a.nb_visits*100).toFixed(2);return l="".concat(l,"%"),c+=C("General_ComparisonCardTooltip1",["'".concat(i.compareSegmentPretty,"'"),i.comparePeriodPretty,l,i.nb_visits.toString(),a.nb_visits.toString()]),t.index>0&&(c+="<br/><br/>",c+=C("General_ComparisonCardTooltip2",[i.nb_visits_change.toString(),s.compareSegmentPretty,s.comparePeriodPretty])),c+="</div>",c}},updated:function(){var e=this;setTimeout((function(){return e.setUpTooltips()}))},mounted:function(){var e=this;P.on("piwikComparisonsChanged",(function(){e.onComparisonsChanged()})),this.onComparisonsChanged(),setTimeout((function(){return e.setUpTooltips()}))},beforeUnmount:function(){try{window.$(this.refs.root).tooltip("destroy")}catch(e){}}});tn.render=Xt;var nn=tn;
+ */st({component:Nn,scope:{startDate:{angularJsBind:"<"},endDate:{angularJsBind:"<"},rangeChange:{angularJsBind:"&"},submit:{angularJsBind:"&"}},directiveName:"piwikDateRangePicker",restrict:"E"});function Mn(e,t,n,r,a,i){var l=Object(o["resolveComponent"])("DatePicker");return Object(o["openBlock"])(),Object(o["createBlock"])(l,{"selected-date-start":e.selectedDates[0],"selected-date-end":e.selectedDates[1],"highlighted-date-start":e.highlightedDates[0],"highlighted-date-end":e.highlightedDates[1],"view-date":e.viewDate,"step-months":"year"===e.period?12:1,"disable-month-dropdown":"year"===e.period,onCellHover:t[0]||(t[0]=function(t){return e.onHoverNormalCell(t.date,t.$cell)}),onCellHoverLeave:t[1]||(t[1]=function(t){return e.onHoverLeaveNormalCells()}),onDateSelect:t[2]||(t[2]=function(t){return e.onDateSelected(t.date)})},null,8,["selected-date-start","selected-date-end","highlighted-date-start","highlighted-date-end","view-date","step-months","disable-month-dropdown"])}var Fn=new Date(j.minDateYear,j.minDateMonth-1,j.minDateDay),Rn=new Date(j.maxDateYear,j.maxDateMonth-1,j.maxDateDay),Vn=Object(o["defineComponent"])({props:{period:String,date:[String,Date]},components:{DatePicker:In},emits:["select"],setup:function(e,t){var n=Object(o["ref"])(e.date),r=Object(o["ref"])([null,null]),a=Object(o["ref"])([null,null]);function i(t){var n=p.get(e.period).parse(t).getDateRange();return n[0]=Fn<n[0]?n[0]:Fn,n[1]=Rn>n[1]?n[1]:Rn,n}function l(t,n){var r=t<Fn||t>Rn,o=n.hasClass("ui-datepicker-other-month")&&("month"===e.period||"day"===e.period);a.value=r||o?[null,null]:i(t)}function s(){a.value=[null,null]}function c(e){t.emit("select",{date:e})}function u(){e.period&&e.date?r.value=i(e.date):r.value=[null,null]}return Object(o["watch"])(e,u),u(),{selectedDates:r,highlightedDates:a,viewDate:n,onHoverNormalCell:l,onHoverLeaveNormalCells:s,onDateSelected:c}}});Vn.render=Mn;var Ln=Vn,Un=(st({component:Ln,scope:{period:{angularJsBind:"<"},date:{angularJsBind:"<"},select:{angularJsBind:"&"}},directiveName:"piwikPeriodDatePicker",restrict:"E"}),{class:"loadingPiwik"}),_n=Object(o["createElementVNode"])("img",{src:"plugins/Morpheus/images/loading-blue.gif",alt:""},null,-1);
/*!
* Matomo - free/libre analytics platform
*
* @link https://matomo.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- */function rn(){return _t}rn.$inject=[],angular.module("piwikApp.service").factory("piwikComparisonsService",rn);Le({component:nn,directiveName:"piwikComparisons",restrict:"E"});var an={class:"loadingPiwik"},on=Object(o["createElementVNode"])("img",{src:"plugins/Morpheus/images/loading-blue.gif",alt:""},null,-1);function sn(e,t,n,r,a,i){return Object(o["withDirectives"])((Object(o["openBlock"])(),Object(o["createElementBlock"])("div",an,[on,Object(o["createElementVNode"])("span",null,Object(o["toDisplayString"])(e.loadingMessage),1)],512)),[[o["vShow"],e.loading]])}var cn=Object(o["defineComponent"])({props:{loading:{type:Boolean,required:!0,default:!1},loadingMessage:{type:String,required:!1,default:C("General_LoadingData")}}});cn.render=sn;var ln=cn,un=Le({component:ln,scope:{loading:{vue:"loading",angularJsBind:"<"},loadingMessage:{vue:"loadingMessage",angularJsBind:"<",default:function(){return C("General_LoadingData")}}},$inject:[],directiveName:"piwikActivityIndicator"});
+ */function Jn(e,t,n,r,a,i){return Object(o["withDirectives"])((Object(o["openBlock"])(),Object(o["createElementBlock"])("div",Un,[_n,Object(o["createElementVNode"])("span",null,Object(o["toDisplayString"])(e.loadingMessage),1)],512)),[[o["vShow"],e.loading]])}var qn=Object(o["defineComponent"])({props:{loading:{type:Boolean,required:!0,default:!1},loadingMessage:{type:String,required:!1,default:P("General_LoadingData")}}});qn.render=Jn;var Gn=qn,Qn=st({component:Gn,scope:{loading:{vue:"loading",angularJsBind:"<"},loadingMessage:{vue:"loadingMessage",angularJsBind:"<",default:function(){return P("General_LoadingData")}}},$inject:[],directiveName:"piwikActivityIndicator"});
/*!
* Matomo - free/libre analytics platform
*
* @link https://matomo.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- */function dn(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function pn(e,t,n,r,a,i){return Object(o["openBlock"])(),Object(o["createElementBlock"])("div",{class:Object(o["normalizeClass"])(["alert",dn({},"alert-".concat(e.severity),!0)])},[Object(o["renderSlot"])(e.$slots,"default")],2)}var fn=Object(o["defineComponent"])({props:{severity:{type:String,required:!0}}});fn.render=pn;var mn=fn,gn=Le({component:mn,scope:{severity:{vue:"severity",angularJsBind:"@piwikAlert"}},directiveName:"piwikAlert",transclude:!0});
+ */function zn(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function Yn(e,t,n,r,a,i){return Object(o["openBlock"])(),Object(o["createElementBlock"])("div",{class:Object(o["normalizeClass"])(["alert",zn({},"alert-".concat(e.severity),!0)])},[Object(o["renderSlot"])(e.$slots,"default")],2)}var Wn=Object(o["defineComponent"])({props:{severity:{type:String,required:!0}}});Wn.render=Yn;var Kn=Wn,Xn=st({component:Kn,scope:{severity:{vue:"severity",angularJsBind:"@piwikAlert"}},directiveName:"piwikAlert",transclude:!0});
/*!
* Matomo - free/libre analytics platform
*
diff --git a/plugins/CoreHome/vue/src/DatePicker/DatePicker.adapter.ts b/plugins/CoreHome/vue/src/DatePicker/DatePicker.adapter.ts
new file mode 100644
index 0000000000..71223d58f2
--- /dev/null
+++ b/plugins/CoreHome/vue/src/DatePicker/DatePicker.adapter.ts
@@ -0,0 +1,62 @@
+/*!
+ * Matomo - free/libre analytics platform
+ *
+ * @link https://matomo.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+import { ITimeoutService } from 'angular';
+import createAngularJsAdapter from '../createAngularJsAdapter';
+import DatePicker from './DatePicker.vue';
+
+export default createAngularJsAdapter({
+ component: DatePicker,
+ scope: {
+ selectedDateStart: {
+ angularJsBind: '<',
+ },
+ selectedDateEnd: {
+ angularJsBind: '<',
+ },
+ highlightedDateStart: {
+ angularJsBind: '<',
+ },
+ highlightedDateEnd: {
+ angularJsBind: '<',
+ },
+ viewDate: {
+ angularJsBind: '<',
+ },
+ stepMonths: {
+ angularJsBind: '<',
+ },
+ disableMonthDropdown: {
+ angularJsBind: '<',
+ },
+ options: {
+ angularJsBind: '<',
+ },
+ cellHover: {
+ angularJsBind: '&',
+ },
+ cellHoverLeave: {
+ angularJsBind: '&',
+ },
+ dateSelect: {
+ angularJsBind: '&',
+ },
+ },
+ directiveName: 'piwikDatePicker',
+ events: {
+ 'cell-hover': (event, scope, element, attrs, $timeout: ITimeoutService) => {
+ $timeout(); // trigger new digest
+ },
+ 'cell-hover-leave': (event, scope, element, attrs, $timeout: ITimeoutService) => {
+ $timeout(); // trigger new digest
+ },
+ 'date-select': (event, scope, element, attrs, $timeout: ITimeoutService) => {
+ $timeout(); // trigger new digest
+ },
+ },
+ $inject: ['$timeout'],
+});
diff --git a/plugins/CoreHome/vue/src/DatePicker/DatePicker.vue b/plugins/CoreHome/vue/src/DatePicker/DatePicker.vue
new file mode 100644
index 0000000000..784d0d9311
--- /dev/null
+++ b/plugins/CoreHome/vue/src/DatePicker/DatePicker.vue
@@ -0,0 +1,366 @@
+<!--
+ Matomo - free/libre analytics platform
+ @link https://matomo.org
+ @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+-->
+
+<template>
+ <div ref="root"/>
+</template>
+
+<script lang="ts">
+import {
+ defineComponent,
+ ref,
+ watch,
+ onMounted,
+} from 'vue';
+import JQuery = JQuery;
+import Matomo from '../Matomo/Matomo';
+import { parseDate } from '../Periods';
+
+const DEFAULT_STEP_MONTHS = 1;
+
+const { $ } = window;
+
+export default defineComponent({
+ props: {
+ selectedDateStart: Date,
+ selectedDateEnd: Date,
+ highlightedDateStart: Date,
+ highlightedDateEnd: Date,
+ viewDate: [String, Date],
+ stepMonths: Number,
+ disableMonthDropdown: Boolean,
+ options: Object,
+ },
+ emits: ['cellHover', 'cellHoverLeave', 'dateSelect'],
+ setup(props, context) {
+ const root = ref<HTMLElement>(null);
+
+ function setDateCellColor($dateCell: JQuery, dateValue: Date): void {
+ const $dateCellLink = $dateCell.children('a');
+
+ if (props.selectedDateStart
+ && props.selectedDateEnd
+ && dateValue >= props.selectedDateStart
+ && dateValue <= props.selectedDateEnd
+ ) {
+ $dateCell.addClass('ui-datepicker-current-period');
+ } else {
+ $dateCell.removeClass('ui-datepicker-current-period');
+ }
+
+ if (props.highlightedDateStart
+ && props.highlightedDateEnd
+ && dateValue >= props.highlightedDateStart
+ && dateValue <= props.highlightedDateEnd
+ ) {
+ // other-month cells don't have links, so the <td> must have the ui-state-hover class
+ const elementToAddClassTo = $dateCellLink.length ? $dateCellLink : $dateCell;
+ elementToAddClassTo.addClass('ui-state-hover');
+ } else {
+ $dateCell.removeClass('ui-state-hover');
+ $dateCellLink.removeClass('ui-state-hover');
+ }
+ }
+
+ function getCellDate($dateCell: JQuery, month: number, year: number): Date {
+ if ($dateCell.hasClass('ui-datepicker-other-month')) {
+ return getOtherMonthDate($dateCell, month, year); // eslint-disable-line
+ }
+
+ const day = parseInt($dateCell.children('a,span').text(), 10);
+
+ return new Date(year, month, day);
+ }
+
+ function getOtherMonthDate($dateCell, month, year) {
+ let date;
+
+ const $row = $dateCell.parent();
+ const $rowCells = $row.children('td');
+
+ // if in the first row, the date cell is before the current month
+ if ($row.is(':first-child')) {
+ const $firstDateInMonth = $row.children('td:not(.ui-datepicker-other-month)').first();
+
+ date = getCellDate($firstDateInMonth, month, year);
+ date.setDate($rowCells.index($dateCell) - $rowCells.index($firstDateInMonth) + 1);
+ return date;
+ }
+
+ // the date cell is after the current month
+ const $lastDateInMonth = $row.children('td:not(.ui-datepicker-other-month)').last();
+
+ date = getCellDate($lastDateInMonth, month, year);
+ date.setDate(date.getDate() + $rowCells.index($dateCell) - $rowCells.index($lastDateInMonth));
+ return date;
+ }
+
+ function getMonthYearDisplayed(): number[] {
+ const element = $(root.value);
+
+ const $firstCellWithMonth = element.find('td[data-month]');
+ const month = parseInt($firstCellWithMonth.attr('data-month'), 10);
+ const year = parseInt($firstCellWithMonth.attr('data-year'), 10);
+
+ return [month, year];
+ }
+
+ function setDatePickerCellColors() {
+ const element = $(root.value);
+
+ const $calendarTable = element.find('.ui-datepicker-calendar');
+
+ const monthYear = getMonthYearDisplayed();
+
+ // highlight the rest of the cells by first getting the date for the first cell
+ // in the calendar, then just incrementing by one for the rest of the cells.
+ const $cells = $calendarTable.find('td');
+ const $firstDateCell = $cells.first();
+ const currentDate = getCellDate($firstDateCell, monthYear[0], monthYear[1]);
+
+ $cells.each(function setCellColor() {
+ setDateCellColor($(this), currentDate);
+
+ currentDate.setDate(currentDate.getDate() + 1);
+ });
+ }
+
+ function viewDateChanged(): boolean {
+ let date = props.viewDate;
+ if (!date) {
+ return false;
+ }
+
+ if (!(date instanceof Date)) {
+ try {
+ date = parseDate(date);
+ } catch (e) {
+ return false;
+ }
+ }
+
+ const element = $(root.value);
+
+ // only change the datepicker date if the date is outside of the current month/year.
+ // this avoids a re-render in other cases.
+ const monthYear = getMonthYearDisplayed();
+ if (monthYear[0] !== date.getMonth() || monthYear[1] !== date.getFullYear()) {
+ element.datepicker('setDate', date);
+ return true;
+ }
+
+ return false;
+ }
+
+ // remove the ui-state-active class & click handlers for every cell. we bypass
+ // the datepicker's date selection logic for smoother browser rendering.
+ function onJqueryUiRenderedPicker(): void {
+ const element = $(root.value);
+
+ element.find('td[data-event]').off('click');
+ element.find('.ui-state-active').removeClass('ui-state-active');
+ element.find('.ui-datepicker-current-day').removeClass('ui-datepicker-current-day');
+
+ // add href to left/right nav in calendar so they can be accessed via keyboard
+ element.find('.ui-datepicker-prev,.ui-datepicker-next').attr('href', '');
+ }
+
+ function stepMonthsChanged(): boolean {
+ const element = $(root.value);
+
+ const stepMonths = props.stepMonths || DEFAULT_STEP_MONTHS;
+ if (element.datepicker('option', 'stepMonths') === stepMonths) {
+ return false;
+ }
+
+ // setting stepMonths will change the month in view back to the selected date. to avoid
+ // we set the selected date to the month in view.
+ const currentMonth = $('.ui-datepicker-month', element).val();
+ const currentYear = $('.ui-datepicker-year', element).val();
+
+ element
+ .datepicker('option', 'stepMonths', stepMonths)
+ .datepicker('setDate', new Date(currentYear, currentMonth));
+
+ onJqueryUiRenderedPicker();
+
+ return true;
+ }
+
+ function enableDisableMonthDropdown(): void {
+ const element = $(root.value);
+
+ element.find('.ui-datepicker-month').attr('disabled', props.disableMonthDropdown);
+ }
+
+ function handleOtherMonthClick() {
+ if (!$(this).hasClass('ui-state-hover')) {
+ return;
+ }
+
+ const $row = $(this).parent();
+ const $tbody = $row.parent();
+
+ if ($row.is(':first-child')) {
+ // click on first of the month
+ $tbody.find('a').first().click();
+ } else {
+ // click on last of month
+ $tbody.find('a').last().click();
+ }
+ }
+
+ function onCalendarViewChange() {
+ // clicking left/right re-enables the month dropdown, so we disable it again
+ enableDisableMonthDropdown();
+
+ setDatePickerCellColors();
+ }
+
+ // on a prop change (NOTE: we can't watch just `props`, since then newProps and oldProps will
+ // have the same values (since it is a proxy object). Using a copy doesn't quite work, the
+ // object it returns will always be different, BUT, since we check what changes it works
+ // for our purposes. The only downside is that it runs on every tick basically, but since
+ // that is within the context of the date picker component, it's bearable.
+ watch(() => ({ ...props }), (newProps: typeof props, oldProps: typeof props) => {
+ let redraw = false;
+
+ [
+ 'selectedDateStart',
+ 'selectedDateEnd',
+ 'highlightedDateStart',
+ 'highlightedDateEnd',
+ ].forEach((propName) => {
+ if (redraw) {
+ return;
+ }
+
+ if (!newProps[propName] && oldProps[propName]) {
+ redraw = true;
+ }
+
+ if (newProps[propName] && !oldProps[propName]) {
+ redraw = true;
+ }
+
+ if (newProps[propName]
+ && oldProps[propName]
+ && newProps[propName].getTime() !== oldProps[propName].getTime()
+ ) {
+ redraw = true;
+ }
+ });
+
+ if (newProps.viewDate !== oldProps.viewDate && viewDateChanged()) {
+ redraw = true;
+ }
+
+ if (newProps.stepMonths !== oldProps.stepMonths) {
+ stepMonthsChanged();
+ }
+
+ if (newProps.enableDisableMonthDropdown !== oldProps.enableDisableMonthDropdown) {
+ enableDisableMonthDropdown();
+ }
+
+ // redraw when selected/highlighted dates change
+ if (redraw) {
+ setDatePickerCellColors();
+ }
+ });
+
+ onMounted(() => {
+ const element = $(root.value);
+
+ const customOptions = props.options || {};
+ const datePickerOptions = {
+ ...Matomo.getBaseDatePickerOptions(),
+ ...customOptions,
+ onChangeMonthYear: () => {
+ // datepicker renders the HTML after this hook is called, so we use setTimeout
+ // to run some code after the render.
+ setTimeout(() => {
+ onJqueryUiRenderedPicker();
+ });
+ },
+ };
+ element.datepicker(datePickerOptions);
+
+ element.on('mouseover', 'tbody td a', (event) => {
+ // this event is triggered when a user clicks a date as well. in that case,
+ // the originalEvent is null. we don't need to redraw again for that, so
+ // we ignore events like that.
+ if (event.originalEvent) {
+ setDatePickerCellColors();
+ }
+ });
+
+ // on hover cell, execute scope.cellHover()
+ element.on('mouseenter', 'tbody td', function onMouseEnter() {
+ const monthYear = getMonthYearDisplayed();
+
+ const $dateCell = $(this);
+ const dateValue = getCellDate($dateCell, monthYear[0], monthYear[1]);
+ context.emit('cellHover', { date: dateValue, $cell: $dateCell });
+ });
+
+ // overrides jquery UI handler that unhighlights a cell when the mouse leaves it
+ element.on('mouseout', 'tbody td a', () => {
+ setDatePickerCellColors();
+ });
+
+ // call scope.cellHoverLeave() when mouse leaves table body (can't do event on tbody, for
+ // some reason that fails, so we do two events, one on the table & one on thead)
+ element
+ .on('mouseleave', 'table', () => context.emit('cellHoverLeave'))
+ .on('mouseenter', 'thead', () => context.emit('cellHoverLeave'));
+
+ // make sure whitespace is clickable when the period makes it appropriate
+ element.on('click', 'tbody td.ui-datepicker-other-month',
+ () => handleOtherMonthClick());
+
+ // NOTE: using a selector w/ .on() doesn't seem to work for some reason...
+ element.on('click', (e) => {
+ e.preventDefault();
+
+ const $target = $(e.target).closest('a');
+ if (!$target.is('.ui-datepicker-next')
+ && !$target.is('.ui-datepicker-prev')
+ ) {
+ return;
+ }
+
+ onCalendarViewChange();
+ });
+
+ // when a cell is clicked, invoke the onDateSelected function. this, in conjunction
+ // with onJqueryUiRenderedPicker(), overrides the date picker's click behavior.
+ element.on('click', 'td[data-month]', (event) => {
+ const $cell = $(event.target).closest('td') as JQuery;
+ const month = parseInt($cell.attr('data-month'), 10);
+ const year = parseInt($cell.attr('data-year'), 10);
+ const day = parseInt($cell.children('a,span').text(), 10);
+ context.emit('dateSelect', { date: new Date(year, month, day) });
+ });
+
+ const renderPostProcessed = stepMonthsChanged();
+
+ viewDateChanged();
+ enableDisableMonthDropdown();
+
+ if (!renderPostProcessed) {
+ onJqueryUiRenderedPicker();
+ }
+
+ setDatePickerCellColors();
+ });
+
+ return {
+ root,
+ };
+ },
+});
+</script>
diff --git a/plugins/CoreHome/vue/src/DateRangePicker/DateRangePicker.adapter.ts b/plugins/CoreHome/vue/src/DateRangePicker/DateRangePicker.adapter.ts
new file mode 100644
index 0000000000..12fda3b240
--- /dev/null
+++ b/plugins/CoreHome/vue/src/DateRangePicker/DateRangePicker.adapter.ts
@@ -0,0 +1,29 @@
+/*!
+ * Matomo - free/libre analytics platform
+ *
+ * @link https://matomo.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+import createAngularJsAdapter from '../createAngularJsAdapter';
+import DateRangePicker from './DateRangePicker.vue';
+
+export default createAngularJsAdapter({
+ component: DateRangePicker,
+ scope: {
+ startDate: {
+ angularJsBind: '<',
+ },
+ endDate: {
+ angularJsBind: '<',
+ },
+ rangeChange: {
+ angularJsBind: '&',
+ },
+ submit: {
+ angularJsBind: '&',
+ },
+ },
+ directiveName: 'piwikDateRangePicker',
+ restrict: 'E',
+});
diff --git a/plugins/CoreHome/angularjs/date-range-picker/date-range-picker.component.less b/plugins/CoreHome/vue/src/DateRangePicker/DateRangePicker.less
index f380d44ac5..f380d44ac5 100644
--- a/plugins/CoreHome/angularjs/date-range-picker/date-range-picker.component.less
+++ b/plugins/CoreHome/vue/src/DateRangePicker/DateRangePicker.less
diff --git a/plugins/CoreHome/vue/src/DateRangePicker/DateRangePicker.vue b/plugins/CoreHome/vue/src/DateRangePicker/DateRangePicker.vue
new file mode 100644
index 0000000000..c2af7ecb1c
--- /dev/null
+++ b/plugins/CoreHome/vue/src/DateRangePicker/DateRangePicker.vue
@@ -0,0 +1,186 @@
+<!--
+ Matomo - free/libre analytics platform
+ @link https://matomo.org
+ @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+-->
+
+<template>
+ <div id="calendarRangeFrom">
+ <h6>
+ {{ translate('General_DateRangeFrom') }}
+ <input
+ type="text"
+ id="inputCalendarFrom"
+ name="inputCalendarFrom"
+ class="browser-default"
+ v-model="startDateText"
+ v-on:change="onRangeInputChanged('from', $event)"
+ v-on:keyup="handleEnterPress($event)"
+ />
+ </h6>
+ <DatePicker
+ id="calendarFrom"
+ :view-date="startDate"
+ :selected-date-start="fromPickerSelectedDates[0]"
+ :selected-date-end="fromPickerSelectedDates[1]"
+ :highlighted-date-start="fromPickerHighlightedDates[0]"
+ :highlighted-date-end="fromPickerHighlightedDates[1]"
+ @date-select="setStartRangeDate($event.date)"
+ @cell-hover="fromPickerHighlightedDates = getNewHighlightedDates($event.date, $event.$cell)"
+ @cell-hover-leave="fromPickerHighlightedDates = [null, null]"
+ >
+ </DatePicker>
+ </div>
+ <div id="calendarRangeTo">
+ <h6>
+ {{ translate('General_DateRangeTo') }}
+ <input
+ type="text"
+ id="inputCalendarTo"
+ name="inputCalendarTo"
+ class="browser-default"
+ v-model="endDateText"
+ v-on:change="onRangeInputChanged('to', $event)"
+ v-on:keyup="handleEnterPress($event)"
+ />
+ </h6>
+ <DatePicker
+ id="calendarTo"
+ :view-date="endDate"
+ :selected-date-start="toPickerSelectedDates[0]"
+ :selected-date-end="toPickerSelectedDates[1]"
+ :highlighted-date-start="toPickerHighlightedDates[0]"
+ :highlighted-date-end="toPickerHighlightedDates[1]"
+ @date-select="setEndRangeDate($event.date)"
+ @cell-hover="toPickerHighlightedDates = getNewHighlightedDates($event.date, $event.$cell)"
+ @cell-hover-leave="toPickerHighlightedDates = [null, null]"
+ >
+ </DatePicker>
+ </div>
+</template>
+
+<script lang="ts">
+import { defineComponent } from 'vue';
+import JQuery = JQuery;
+import DatePicker from '../DatePicker/DatePicker.vue';
+import { parseDate, format } from '../Periods/utilities';
+import ChangeEvent = JQuery.ChangeEvent;
+
+export default defineComponent({
+ props: {
+ startDate: String,
+ endDate: String,
+ },
+ components: {
+ DatePicker,
+ },
+ data() {
+ let startDate = null;
+ try {
+ startDate = parseDate(this.startDate);
+ } catch (e) {
+ // ignore
+ }
+
+ let endDate = null;
+ try {
+ endDate = parseDate(this.endDate);
+ } catch (e) {
+ // ignore
+ }
+
+ return {
+ fromPickerSelectedDates: [startDate, startDate],
+ toPickerSelectedDates: [endDate, endDate],
+ fromPickerHighlightedDates: [null, null],
+ toPickerHighlightedDates: [null, null],
+ startDateText: this.startDate,
+ endDateText: this.endDate,
+ };
+ },
+ emits: ['rangeChange', 'submit'],
+ watch: {
+ startDate() {
+ this.startDateText = this.startDate;
+ this.setStartRangeDateFromStr(this.startDate);
+ },
+ endDate() {
+ this.endDateText = this.endDate;
+ this.setEndRangeDateFromStr(this.endDate);
+ },
+ },
+ mounted() {
+ this.rangeChanged(); // emit with initial range pair
+ },
+ methods: {
+ setStartRangeDate(date: Date) {
+ this.fromPickerSelectedDates = [date, date];
+
+ this.rangeChanged();
+ },
+ setEndRangeDate(date: Date) {
+ this.toPickerSelectedDates = [date, date];
+
+ this.rangeChanged();
+ },
+ onRangeInputChanged(source: string, event: ChangeEvent) {
+ if (source === 'from') {
+ this.setStartRangeDateFromStr(event.target.value);
+ } else {
+ this.setEndRangeDateFromStr(event.target.value);
+ }
+ },
+ getNewHighlightedDates(date: Date, $cell: JQuery) {
+ if ($cell.hasClass('ui-datepicker-unselectable')) {
+ return null;
+ }
+
+ return [date, date];
+ },
+ handleEnterPress($event: KeyboardEvent) {
+ if ($event.keyCode !== 13) {
+ return;
+ }
+
+ this.$emit('submit', {
+ start: this.startDate,
+ end: this.endDate,
+ });
+ },
+ setStartRangeDateFromStr(dateStr: string) {
+ let startDateParsed: Date;
+ try {
+ startDateParsed = parseDate(dateStr);
+ } catch (e) {
+ this.startDateText = this.startDate;
+ }
+
+ if (startDateParsed) {
+ this.fromPickerSelectedDates = [startDateParsed, startDateParsed];
+ }
+
+ this.rangeChanged();
+ },
+ setEndRangeDateFromStr(dateStr: string) {
+ let endDateParsed: Date;
+ try {
+ endDateParsed = parseDate(dateStr);
+ } catch (e) {
+ this.endDateText = this.endDate;
+ }
+
+ if (endDateParsed) {
+ this.toPickerSelectedDates = [endDateParsed, endDateParsed];
+ }
+
+ this.rangeChanged();
+ },
+ rangeChanged() {
+ this.$emit('rangeChange', {
+ start: format(this.fromPickerSelectedDates[0]),
+ end: format(this.toPickerSelectedDates[0]),
+ });
+ },
+ },
+});
+</script>
diff --git a/plugins/CoreHome/vue/src/ExpandOnClick/ExpandOnClick.adapter.ts b/plugins/CoreHome/vue/src/ExpandOnClick/ExpandOnClick.adapter.ts
new file mode 100644
index 0000000000..f7dff78fde
--- /dev/null
+++ b/plugins/CoreHome/vue/src/ExpandOnClick/ExpandOnClick.adapter.ts
@@ -0,0 +1,34 @@
+/*!
+ * Matomo - free/libre analytics platform
+ *
+ * @link https://matomo.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+import { IDirective, IScope } from 'angular';
+import ExpandOnClick from './ExpandOnClick';
+
+export default function piwikExpandOnClick(): IDirective {
+ return {
+ restrict: 'A',
+ link: function expandOnClickLink(scope: IScope, element: JQuery) {
+ const binding = {
+ instance: null,
+ value: {
+ expander: element.find('.title').first()[0],
+ },
+ oldValue: null,
+ modifiers: {},
+ dir: {},
+ };
+
+ const wrapped = ExpandOnClick;
+ wrapped.mounted(element[0], binding);
+ element.on('$destroy', () => wrapped.unmounted(element[0], binding));
+ },
+ };
+}
+
+piwikExpandOnClick.$inject = [];
+
+angular.module('piwikApp').directive('piwikExpandOnClick', piwikExpandOnClick);
diff --git a/plugins/CoreHome/vue/src/ExpandOnClick/ExpandOnClick.ts b/plugins/CoreHome/vue/src/ExpandOnClick/ExpandOnClick.ts
new file mode 100644
index 0000000000..9ce10091d5
--- /dev/null
+++ b/plugins/CoreHome/vue/src/ExpandOnClick/ExpandOnClick.ts
@@ -0,0 +1,105 @@
+/*!
+ * Matomo - free/libre analytics platform
+ *
+ * @link https://matomo.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+import { DirectiveBinding } from 'vue';
+import Matomo from '../Matomo/Matomo';
+
+interface ExpandOnClickArgs {
+ expander: HTMLElement,
+
+ isMouseDown?: boolean;
+ hasScrolled?: boolean;
+
+ onExpand?: () => void;
+ onClickOutsideElement?: (event: MouseEvent) => void;
+ onScroll?: () => void;
+ onMouseDown?: () => void;
+ onEscapeHandler?: (event: KeyboardEvent) => void;
+}
+
+function onExpand(element: HTMLElement) {
+ element.classList.toggle('expanded');
+
+ const positionElement = element.querySelector('.dropdown.positionInViewport');
+ if (positionElement) {
+ Matomo.helper.setMarginLeftToBeInViewport(positionElement);
+ }
+}
+
+function onClickOutsideElement(
+ element: HTMLElement,
+ binding: DirectiveBinding<ExpandOnClickArgs>,
+ event: MouseEvent,
+) {
+ const hadUsedScrollbar = binding.value.isMouseDown && binding.value.hasScrolled;
+ binding.value.isMouseDown = false;
+ binding.value.hasScrolled = false;
+
+ if (hadUsedScrollbar) {
+ return;
+ }
+
+ if (!element.contains(event.target as HTMLElement)) {
+ element.classList.remove('expanded');
+ }
+}
+
+function onScroll(binding: DirectiveBinding<ExpandOnClickArgs>) {
+ binding.value.hasScrolled = true;
+}
+
+function onMouseDown(binding: DirectiveBinding<ExpandOnClickArgs>) {
+ binding.value.isMouseDown = true;
+ binding.value.hasScrolled = false;
+}
+
+function onEscapeHandler(
+ element: HTMLElement,
+ binding: DirectiveBinding<ExpandOnClickArgs>,
+ event: KeyboardEvent,
+) {
+ if (event.which === 27) {
+ binding.value.isMouseDown = false;
+ binding.value.hasScrolled = false;
+ element.classList.remove('expanded');
+ }
+}
+
+const doc = document.documentElement;
+
+/**
+ * Usage (in a component):
+ *
+ * directives: {
+ * ExpandOnClick: ExpandOnClick(), // function call is important since we store state
+ * // in this directive
+ * }
+ */
+export default {
+ mounted(el: HTMLElement, binding: DirectiveBinding<ExpandOnClickArgs>): void {
+ binding.value.isMouseDown = false;
+ binding.value.hasScrolled = false;
+ binding.value.onExpand = onExpand.bind(null, el);
+ binding.value.onEscapeHandler = onEscapeHandler.bind(null, el, binding);
+ binding.value.onMouseDown = onMouseDown.bind(null, binding);
+ binding.value.onClickOutsideElement = onClickOutsideElement.bind(null, el, binding);
+ binding.value.onScroll = onScroll.bind(null, binding);
+
+ binding.value.expander.addEventListener('click', binding.value.onExpand);
+ doc.addEventListener('keyup', binding.value.onEscapeHandler);
+ doc.addEventListener('mousedown', binding.value.onMouseDown);
+ doc.addEventListener('mouseup', binding.value.onClickOutsideElement);
+ doc.addEventListener('scroll', binding.value.onScroll);
+ },
+ unmounted(el: HTMLElement, binding: DirectiveBinding<ExpandOnClickArgs>): void {
+ binding.value.expander.removeEventListener('click', binding.value.onExpand);
+ doc.removeEventListener('keyup', binding.value.onEscapeHandler);
+ doc.removeEventListener('mousedown', binding.value.onMouseDown);
+ doc.removeEventListener('mouseup', binding.value.onClickOutsideElement);
+ doc.removeEventListener('scroll', binding.value.onScroll);
+ },
+};
diff --git a/plugins/CoreHome/vue/src/ExpandOnHover/ExpandOnHover.adapter.ts b/plugins/CoreHome/vue/src/ExpandOnHover/ExpandOnHover.adapter.ts
new file mode 100644
index 0000000000..5ffdc00153
--- /dev/null
+++ b/plugins/CoreHome/vue/src/ExpandOnHover/ExpandOnHover.adapter.ts
@@ -0,0 +1,33 @@
+/*!
+ * Matomo - free/libre analytics platform
+ *
+ * @link https://matomo.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+import ExpandOnHover from './ExpandOnHover';
+
+function piwikExpandOnHover() {
+ return {
+ restrict: 'A',
+ link: function expandOnHoverLink(scope, element) {
+ const binding = {
+ instance: null,
+ value: {
+ expander: element.find('.title').first()[0],
+ },
+ oldValue: null,
+ modifiers: {},
+ dir: {},
+ };
+
+ const wrapped = ExpandOnHover;
+ wrapped.mounted(element[0], binding);
+ element.on('$destroy', () => wrapped.unmounted(element[0], binding));
+ },
+ };
+}
+
+piwikExpandOnHover.$inject = [];
+
+angular.module('piwikApp').directive('piwikExpandOnHover', piwikExpandOnHover);
diff --git a/plugins/CoreHome/vue/src/ExpandOnHover/ExpandOnHover.ts b/plugins/CoreHome/vue/src/ExpandOnHover/ExpandOnHover.ts
new file mode 100644
index 0000000000..6d86d0b212
--- /dev/null
+++ b/plugins/CoreHome/vue/src/ExpandOnHover/ExpandOnHover.ts
@@ -0,0 +1,73 @@
+/*!
+ * Matomo - free/libre analytics platform
+ *
+ * @link https://matomo.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+import { DirectiveBinding } from 'vue';
+import Matomo from '../Matomo/Matomo';
+
+interface ExpandOnHoverArgs {
+ expander: HTMLElement,
+
+ onMouseEnter?: () => void;
+ onMouseLeave?: () => void;
+ onClickOutsideElement?: (event: MouseEvent) => void;
+ onEscapeHandler?: (event: KeyboardEvent) => void;
+}
+
+function onMouseEnter(element: HTMLElement) {
+ element.classList.add('expanded');
+
+ const positionElement = element.querySelector('.dropdown.positionInViewport');
+ if (positionElement) {
+ Matomo.helper.setMarginLeftToBeInViewport(positionElement);
+ }
+}
+
+function onMouseLeave(element: HTMLElement) {
+ element.classList.remove('expanded');
+}
+
+function onClickOutsideElement(element: HTMLElement, event: MouseEvent) {
+ if (!element.contains(event.target as HTMLElement)) {
+ element.classList.remove('expanded');
+ }
+}
+
+function onEscapeHandler(element: HTMLElement, event: KeyboardEvent) {
+ if (event.which === 27) {
+ element.classList.remove('expanded');
+ }
+}
+
+const doc = document.documentElement;
+
+/**
+ * Usage (in a component):
+ *
+ * directives: {
+ * ExpandOnHover: ExpandOnHover(), // function call is important since we store state
+ * // in this directive
+ * }
+ */
+export default {
+ mounted(el: HTMLElement, binding: DirectiveBinding<ExpandOnHoverArgs>): void {
+ binding.value.onMouseEnter = onMouseEnter.bind(null, el);
+ binding.value.onMouseLeave = onMouseLeave.bind(null, el);
+ binding.value.onClickOutsideElement = onClickOutsideElement.bind(null, el);
+ binding.value.onEscapeHandler = onEscapeHandler.bind(null, el);
+
+ binding.value.expander.addEventListener('mouseenter', binding.value.onMouseEnter);
+ el.addEventListener('mouseleave', binding.value.onMouseLeave);
+ doc.addEventListener('keyup', binding.value.onEscapeHandler);
+ doc.addEventListener('mouseup', binding.value.onClickOutsideElement);
+ },
+ unmounted(el: HTMLElement, binding: DirectiveBinding<ExpandOnHoverArgs>): void {
+ binding.value.expander.removeEventListener('mouseenter', binding.value.onMouseEnter);
+ el.removeEventListener('mouseleave', binding.value.onMouseLeave);
+ document.removeEventListener('keyup', binding.value.onEscapeHandler);
+ document.removeEventListener('mouseup', binding.value.onClickOutsideElement);
+ },
+};
diff --git a/plugins/CoreHome/vue/src/PeriodDatePicker/PeriodDatePicker.adapter.ts b/plugins/CoreHome/vue/src/PeriodDatePicker/PeriodDatePicker.adapter.ts
new file mode 100644
index 0000000000..b622973309
--- /dev/null
+++ b/plugins/CoreHome/vue/src/PeriodDatePicker/PeriodDatePicker.adapter.ts
@@ -0,0 +1,26 @@
+/*!
+ * Matomo - free/libre analytics platform
+ *
+ * @link https://matomo.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+import createAngularJsAdapter from '../createAngularJsAdapter';
+import PeriodDatePicker from './PeriodDatePicker.vue';
+
+export default createAngularJsAdapter({
+ component: PeriodDatePicker,
+ scope: {
+ period: {
+ angularJsBind: '<',
+ },
+ date: {
+ angularJsBind: '<',
+ },
+ select: {
+ angularJsBind: '&',
+ },
+ },
+ directiveName: 'piwikPeriodDatePicker',
+ restrict: 'E',
+});
diff --git a/plugins/CoreHome/vue/src/PeriodDatePicker/PeriodDatePicker.vue b/plugins/CoreHome/vue/src/PeriodDatePicker/PeriodDatePicker.vue
new file mode 100644
index 0000000000..ab0e8c19f8
--- /dev/null
+++ b/plugins/CoreHome/vue/src/PeriodDatePicker/PeriodDatePicker.vue
@@ -0,0 +1,106 @@
+<!--
+ Matomo - free/libre analytics platform
+ @link https://matomo.org
+ @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+-->
+
+<template>
+ <DatePicker
+ :selected-date-start="selectedDates[0]"
+ :selected-date-end="selectedDates[1]"
+ :highlighted-date-start="highlightedDates[0]"
+ :highlighted-date-end="highlightedDates[1]"
+ :view-date="viewDate"
+ :step-months="period === 'year' ? 12 : 1"
+ :disable-month-dropdown="period === 'year'"
+ @cell-hover="onHoverNormalCell($event.date, $event.$cell)"
+ @cell-hover-leave="onHoverLeaveNormalCells()"
+ @date-select="onDateSelected($event.date)"
+ >
+ </DatePicker>
+</template>
+
+<script lang="ts">
+import { defineComponent, watch, ref } from 'vue';
+import JQuery = JQuery;
+import DatePicker from '../DatePicker/DatePicker.vue';
+import Matomo from '../Matomo/Matomo';
+import Periods from '../Periods/Periods';
+
+const piwikMinDate = new Date(Matomo.minDateYear, Matomo.minDateMonth - 1, Matomo.minDateDay);
+const piwikMaxDate = new Date(Matomo.maxDateYear, Matomo.maxDateMonth - 1, Matomo.maxDateDay);
+
+export default defineComponent({
+ props: {
+ period: String,
+ date: [String, Date],
+ },
+ components: {
+ DatePicker,
+ },
+ emits: ['select'],
+ setup(props, context) {
+ const viewDate = ref(props.date);
+ const selectedDates = ref([null, null]);
+ const highlightedDates = ref([null, null]);
+
+ function getBoundedDateRange(date: string|Date) {
+ const dates = Periods.get(props.period).parse(date).getDateRange();
+
+ // make sure highlighted date range is within min/max date range
+ dates[0] = piwikMinDate < dates[0] ? dates[0] : piwikMinDate;
+ dates[1] = piwikMaxDate > dates[1] ? dates[1] : piwikMaxDate;
+
+ return dates;
+ }
+
+ function onHoverNormalCell(cellDate: Date, $cell: JQuery) {
+ const isOutOfMinMaxDateRange = cellDate < piwikMinDate || cellDate > piwikMaxDate;
+
+ // don't highlight anything if the period is month or day, and we're hovering over calendar
+ // whitespace. since there are no dates, it's doesn't make sense what you're selecting.
+ const shouldNotHighlightFromWhitespace = $cell.hasClass('ui-datepicker-other-month')
+ && (props.period === 'month' || props.period === 'day');
+
+ if (isOutOfMinMaxDateRange
+ || shouldNotHighlightFromWhitespace
+ ) {
+ highlightedDates.value = [null, null];
+ return;
+ }
+
+ highlightedDates.value = getBoundedDateRange(cellDate);
+ }
+
+ function onHoverLeaveNormalCells() {
+ highlightedDates.value = [null, null];
+ }
+
+ function onDateSelected(date: Date) {
+ context.emit('select', { date });
+ }
+
+ function onChanges() {
+ if (!props.period || !props.date) {
+ selectedDates.value = [null, null];
+ return;
+ }
+
+ selectedDates.value = getBoundedDateRange(props.date);
+ }
+
+ watch(props, onChanges);
+
+ onChanges();
+
+ return {
+ selectedDates,
+ highlightedDates,
+ viewDate,
+ onHoverNormalCell,
+ onHoverLeaveNormalCells,
+ onDateSelected,
+ };
+ },
+});
+</script>
diff --git a/plugins/CoreHome/vue/src/createAngularJsAdapter.ts b/plugins/CoreHome/vue/src/createAngularJsAdapter.ts
index 32bd1e17b4..12ff8382bd 100644
--- a/plugins/CoreHome/vue/src/createAngularJsAdapter.ts
+++ b/plugins/CoreHome/vue/src/createAngularJsAdapter.ts
@@ -50,6 +50,16 @@ type ComponentType = ReturnType<typeof defineComponent>;
let transcludeCounter = 0;
+function toKebabCase(arg: string): string {
+ return arg.substring(0, 1).toLowerCase() + arg.substring(1)
+ .replace(/[A-Z]/g, (s) => `-${s.toLowerCase()}`);
+}
+
+function toAngularJsCamelCase(arg: string): string {
+ return arg.substring(0, 1).toLowerCase() + arg.substring(1)
+ .replace(/-([a-z])/g, (s, p) => p.toUpperCase());
+}
+
export default function createAngularJsAdapter<InjectTypes = []>(options: {
component: ComponentType,
scope?: ScopeMapping,
@@ -103,19 +113,29 @@ export default function createAngularJsAdapter<InjectTypes = []>(options: {
) {
const clone = transclude ? ngElement.find(`[ng-transclude][counter=${currentTranscludeCounter}]`) : null;
+ // build the root vue template
let rootVueTemplate = '<root-component';
- Object.entries(scope).forEach(([, info]) => {
- rootVueTemplate += ` :${info.vue}="${info.vue}"`;
- });
Object.entries(events).forEach((info) => {
const [eventName] = info;
rootVueTemplate += ` @${eventName}="onEventHandler('${eventName}', $event)"`;
});
+ Object.entries(scope).forEach(([key, info]) => {
+ if (info.angularJsBind === '&') {
+ const eventName = toKebabCase(key);
+ if (!events[eventName]) { // pass through scope & w/o a custom event handler
+ rootVueTemplate += ` @${eventName}="onEventHandler('${eventName}', $event)"`;
+ }
+ } else {
+ rootVueTemplate += ` :${info.vue}="${info.vue}"`;
+ }
+ });
rootVueTemplate += '>';
if (transclude) {
rootVueTemplate += '<div ref="transcludeTarget"/>';
}
rootVueTemplate += '</root-component>';
+
+ // build the vue app
const app = createApp({
template: rootVueTemplate,
data() {
@@ -143,6 +163,11 @@ export default function createAngularJsAdapter<InjectTypes = []>(options: {
},
methods: {
onEventHandler(name: string, $event: any) { // eslint-disable-line
+ const scopePropertyName = toAngularJsCamelCase(name);
+ if (ngScope[scopePropertyName]) {
+ ngScope[scopePropertyName]($event);
+ }
+
if (events[name]) {
events[name]($event, ngScope, ngElement, ngAttrs, ...injectedServices);
}
@@ -153,13 +178,15 @@ export default function createAngularJsAdapter<InjectTypes = []>(options: {
app.config.globalProperties.translate = translate;
app.component('root-component', component);
+ // mount the app
const mountPoint = mountPointFactory
? mountPointFactory(ngScope, ngElement, ngAttrs, ...injectedServices)
: ngElement[0];
const vm = app.mount(mountPoint);
+ // setup watches to bind between angularjs + vue
Object.entries(scope).forEach(([scopeVarName, info]) => {
- if (!info.angularJsBind) {
+ if (!info.angularJsBind || info.angularJsBind === '&') {
return;
}
diff --git a/plugins/CoreHome/vue/src/index.ts b/plugins/CoreHome/vue/src/index.ts
index 1808a8e32c..d7c543baf3 100644
--- a/plugins/CoreHome/vue/src/index.ts
+++ b/plugins/CoreHome/vue/src/index.ts
@@ -15,10 +15,15 @@ import './Periods/Year';
import './Periods/Range';
import './Periods/Periods.adapter';
import './AjaxHelper/AjaxHelper.adapter';
+import './ExpandOnClick/ExpandOnClick.adapter';
+import './ExpandOnHover/ExpandOnHover.adapter';
import './MatomoDialog/MatomoDialog.adapter';
import './EnrichedHeadline/EnrichedHeadline.adapter';
import './ContentBlock/ContentBlock.adapter';
import './Comparisons/Comparisons.adapter';
+import './DatePicker/DatePicker.adapter';
+import './DateRangePicker/DateRangePicker.adapter';
+import './PeriodDatePicker/PeriodDatePicker.adapter';
export { default as createAngularJsAdapter } from './createAngularJsAdapter';
export { default as activityIndicatorAdapter } from './ActivityIndicator/ActivityIndicator.adapter';
@@ -30,6 +35,11 @@ export { default as MatomoUrl } from './MatomoUrl/MatomoUrl';
export { default as Matomo } from './Matomo/Matomo';
export * from './Periods';
export { default as MatomoDialog } from './MatomoDialog/MatomoDialog.vue';
+export { default as ExpandOnClick } from './ExpandOnClick/ExpandOnClick';
+export { default as ExpandOnHover } from './ExpandOnHover/ExpandOnHover';
export { default as EnrichedHeadline } from './EnrichedHeadline/EnrichedHeadline.vue';
export { default as ContentBlock } from './ContentBlock/ContentBlock.vue';
export { default as Comparisons } from './Comparisons/Comparisons.vue';
+export { default as DatePicker } from './DatePicker/DatePicker.vue';
+export { default as DateRangePicker } from './DateRangePicker/DateRangePicker.vue';
+export { default as PeriodDatePicker } from './PeriodDatePicker/PeriodDatePicker.vue';
diff --git a/plugins/CoreVue/types/index.d.ts b/plugins/CoreVue/types/index.d.ts
index a5ae060795..04f0ef874d 100644
--- a/plugins/CoreVue/types/index.d.ts
+++ b/plugins/CoreVue/types/index.d.ts
@@ -68,6 +68,7 @@ declare global {
modalConfirm(element: JQuery|JQLite|HTMLElement|string, callbacks: ModalConfirmCallbacks, options: ModalConfirmOptions);
getAngularDependency(eventName: string): any;
isAngularRenderingThePage(): boolean;
+ setMarginLeftToBeInViewport(elementToPosition: JQuery|JQLite|HTMLElement|string);
}
let piwikHelper: PiwikHelperGlobal;
@@ -105,10 +106,17 @@ declare global {
broadcast: BroadcastGlobal;
ColorManager: ColorManagerService;
ajaxRequestFinished?: () => void;
+ minDateYear: number;
+ minDateMonth: number;
+ minDateDay: number;
+ maxDateYear: number;
+ maxDateMonth: number;
+ maxDateDay: number;
updatePeriodParamsFromUrl(): void;
updateDateInTitle(date: string, period: string): void;
hasUserCapability(capability: string): boolean;
+ getBaseDatePickerOptions(): {[key: string]: any};
on(eventName: string, listener: WrappedEventListener): void;
off(eventName: string, listener: WrappedEventListener): void;
@@ -118,7 +126,6 @@ declare global {
let piwik: PiwikGlobal;
- // add the objects to Window so we can access them through window if needed
interface Window {
angular: IAngularStatic;
globalAjaxQueue: GlobalAjaxQueue;