diff options
author | Benaka <diosmosis@users.noreply.github.com> | 2017-12-03 13:32:15 +0300 |
---|---|---|
committer | Matthieu Aubry <mattab@users.noreply.github.com> | 2017-12-03 13:32:15 +0300 |
commit | 7d35aea046986747911ac3063bb738647a2d3a97 (patch) | |
tree | 3cf41d88f818dbf2d8029df435fd59d2b8ab5513 | |
parent | e7ef6302d69d6fa42212e0910b90dee07c0d35d3 (diff) |
Several fixes/improvements to angular period selector (#12319)
* If a period is filtered out, the result of the periods array becomes an object which breaks the period selector which expects an array.
* Use $onInit instead of directive constructor. Seems angular.js silences errors when this is done.
* Parse previousN/lastN dates correctly in angular periods service.
* Parse periods using piwikPeriods client side, since we cannot assume a date range. Also if an invalid is used for period/date, display ERROR in the period selector.
* Angular will swallow errors from datepicker.parseDate, so add a console.log for developer sanity + make sure period selector has consistent state even when period/date values are invalid (& result in failed date parsing).
* Update misc/log-analytics submodule to latest.
-rw-r--r-- | core/Period/PeriodValidator.php | 2 | ||||
m--------- | misc/log-analytics | 0 | ||||
-rw-r--r-- | plugins/CoreHome/CoreHome.php | 1 | ||||
-rw-r--r-- | plugins/CoreHome/angularjs/common/services/periods.js | 39 | ||||
-rw-r--r-- | plugins/CoreHome/angularjs/common/services/piwik.js | 13 | ||||
-rw-r--r-- | plugins/CoreHome/angularjs/period-selector/period-selector.controller.js | 20 |
6 files changed, 52 insertions, 23 deletions
diff --git a/core/Period/PeriodValidator.php b/core/Period/PeriodValidator.php index 1850edde34..6b6b5310f4 100644 --- a/core/Period/PeriodValidator.php +++ b/core/Period/PeriodValidator.php @@ -38,6 +38,7 @@ class PeriodValidator $periodsAllowed = Config::getInstance()->General['enabled_periods_UI']; $periodsAllowed = array_map('trim', explode(',', $periodsAllowed)); $periodsAllowed = array_unique($periodsAllowed); + $periodsAllowed = array_values($periodsAllowed); return $periodsAllowed; } @@ -49,6 +50,7 @@ class PeriodValidator $periodsAllowed = Config::getInstance()->General['enabled_periods_API']; $periodsAllowed = array_map('trim', explode(',', $periodsAllowed)); $periodsAllowed = array_unique($periodsAllowed); + $periodsAllowed = array_values($periodsAllowed); return $periodsAllowed; } } diff --git a/misc/log-analytics b/misc/log-analytics -Subproject cdb7c3981e0af52ce9666a5721c52a28f16cf96 +Subproject 05a5154712fd9324f31422cace1555693ef3934 diff --git a/plugins/CoreHome/CoreHome.php b/plugins/CoreHome/CoreHome.php index 33a8b3e847..f432043548 100644 --- a/plugins/CoreHome/CoreHome.php +++ b/plugins/CoreHome/CoreHome.php @@ -378,6 +378,7 @@ class CoreHome extends \Piwik\Plugin $translationKeys[] = 'General_Delete'; $translationKeys[] = 'General_Default'; $translationKeys[] = 'General_LoadingData'; + $translationKeys[] = 'General_Error'; $translationKeys[] = 'General_ErrorRequest'; $translationKeys[] = 'General_YourChangesHaveBeenSaved'; $translationKeys[] = 'General_LearnMore'; diff --git a/plugins/CoreHome/angularjs/common/services/periods.js b/plugins/CoreHome/angularjs/common/services/periods.js index 9463367285..487812804b 100644 --- a/plugins/CoreHome/angularjs/common/services/periods.js +++ b/plugins/CoreHome/angularjs/common/services/periods.js @@ -173,11 +173,34 @@ } RangePeriod.parse = function parseRangePeriod(strDate) { - var parts = strDate.split(','); - var start = $.datepicker.parseDate('yy-mm-dd', parts[0]); - var end = $.datepicker.parseDate('yy-mm-dd', parts[1]); + var dates = []; + + if (/^previous/.test(strDate)) { + dates = getLastNRange(strDate.substring(8), 1); + } else if (/^last/.test(strDate)) { + dates = getLastNRange(strDate.substring(4), 0); + } else { + var parts = strDate.split(','); + dates[0] = parseDate(parts[0]); + dates[1] = parseDate(parts[1]); + } + + return new RangePeriod(dates[0], dates[1]); + + function getLastNRange(strAmount, extraDaysStart) { + var nAmount = Math.max(parseInt(strAmount) - 1, 0); + if (isNaN(nAmount)) { + throw new Error('Invalid range date: ' + strDate); + } - return new RangePeriod(start, end); + var endDate = getToday(); + endDate.setDate(endDate.getDate() - extraDaysStart); + + var startDate = new Date(endDate.getTime()); + startDate.setDate(startDate.getDate() - nAmount); + + return [startDate, endDate]; + } }; RangePeriod.getDisplayText = function () { @@ -257,7 +280,13 @@ return yesterday; } - return $.datepicker.parseDate('yy-mm-dd', strDate); + try { + return $.datepicker.parseDate('yy-mm-dd', strDate); + } catch (err) { + // angular swallows this error, so manual console log here + console.error(err.message || err); + throw err; + } } function getToday() { diff --git a/plugins/CoreHome/angularjs/common/services/piwik.js b/plugins/CoreHome/angularjs/common/services/piwik.js index 5cde96e93b..53cace77bf 100644 --- a/plugins/CoreHome/angularjs/common/services/piwik.js +++ b/plugins/CoreHome/angularjs/common/services/piwik.js @@ -19,9 +19,7 @@ var date = piwik.broadcast.getValueFromHash('date'); var period = piwik.broadcast.getValueFromHash('period'); - if (!piwikPeriods.isRecognizedPeriod(period) - || !isValidDateStr(date) - ) { + if (!isValidPeriod(period, date)) { // invalid data in URL return; } @@ -49,14 +47,9 @@ piwik.endDateString = $.datepicker.formatDate('yy-mm-dd', dateRange[1]); } - function isValidDateStr(dateStr) { - if (dateStr.indexOf(',') !== -1) { - var dateParts = dateStr.split(','); - return isValidDateStr(dateParts[0]) && isValidDateStr(dateParts[1]); - } - + function isValidPeriod(periodStr, dateStr) { try { - piwikPeriods.parseDate(dateStr); + piwikPeriods.get(periodStr).parse(dateStr); return true; } catch (e) { return false; diff --git a/plugins/CoreHome/angularjs/period-selector/period-selector.controller.js b/plugins/CoreHome/angularjs/period-selector/period-selector.controller.js index 492df84c68..c48150e696 100644 --- a/plugins/CoreHome/angularjs/period-selector/period-selector.controller.js +++ b/plugins/CoreHome/angularjs/period-selector/period-selector.controller.js @@ -37,8 +37,7 @@ vm.$onChanges = $onChanges; vm.onRangeChange = onRangeChange; vm.isApplyEnabled = isApplyEnabled; - - init(); + vm.$onInit = init; function init() { vm.updateSelectedValuesFromHash(); @@ -85,12 +84,13 @@ vm.periodValue = strPeriod; vm.selectedPeriod = strPeriod; - if (strPeriod === 'range') { - var parts = strDate.split(','); - vm.startRangeDate = parts[0]; - vm.endRangeDate = parts[1]; + vm.dateValue = vm.startRangeDate = vm.endRangeDate = null; - vm.dateValue = piwikPeriods.parseDate(parts[0]); + if (strPeriod === 'range') { + var period = piwikPeriods.get(strPeriod).parse(strDate); + vm.dateValue = period.startDate; + vm.startRangeDate = formatDate(period.startDate); + vm.endRangeDate = formatDate(period.endDate); } else { vm.dateValue = piwikPeriods.parseDate(strDate); setRangeStartEndFromPeriod(strPeriod, strDate); @@ -119,7 +119,11 @@ date = formatDate(vm.dateValue); } - return piwikPeriods.parse(vm.periodValue, date).getPrettyString(); + try { + return piwikPeriods.parse(vm.periodValue, date).getPrettyString(); + } catch (e) { + return _pk_translate('General_Error'); + } } function changeViewedPeriod(period) { |