diff options
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; |