From bf341b7c0ba46691bf3e475ebaa58391363cd7ec Mon Sep 17 00:00:00 2001 From: Peter Zhang Date: Sat, 13 Nov 2021 12:49:08 +1300 Subject: add feedback question, remove other related. (#18262) * remove feedback links remove feedback links * update screen shot update screen shot * add feedback question add feedback question * update close to icon update close to icon * built vue files * remove in line css remove in line css, change to less file * move translation key to plugin move translation key to plugin * remove feedback popup remove feedback popup * update remove some test and feedback related update remove some test and feedback related * add draft tests add draft tests * update feedback add php and UI tests update feedback add php and UI tests * update test screen shots update test screen shots * Update demo.twig add heart to demo page * add feedback back in extend the modal add feedback back in extend the modal * update coreHome update coreHome * update screen shots update screen shots * Update FeedbackQuestion_spec.js update js tests * update test update test * built vue files * update screenshot and js tests update screenshot and js tests * Update FeedbackQuestion_spec.js test success * update screenshot update screenshot * update tests update tests * fix test error fix test error * Removing the refer us popup * Readding accidentally removed language files * update test * update test * remove refer us * update feedback umd js update feedback umd js * merge Andy branch merge Andy branch and update screen shots * revert language changes revert language changes * revert language changes revert language changes * revert language file revert language file * revert unrelated lang change revert unrelated lang change * revert lang change revert lang change * revert lang change revert lang change * Delete ControllerTest.php remove controller test not in used * Update core/Piwik.php Co-authored-by: Ben Burgess <88810029+bx80@users.noreply.github.com> * Update plugins/Morpheus/javascripts/piwikHelper.js Co-authored-by: Ben Burgess <88810029+bx80@users.noreply.github.com> * update a big that cancel and reopen it again update a bug that cancel and reopen it again * update compare error update compare error * Update plugins/Feedback/FeedbackReminder.php Co-authored-by: Stefan Giehl * update feedback show logic update feedback show logic * Update FeedbackQuestion_spec.js update tests * Update Feedback.php remove comments * Update .gitignore * update vue build file update vue build file * built vue files * update vue build file update vue build file * add close button add close button * add close button add close button * update screenshot update screenshot * remove umd remove umd * git add corehome git add corehome * revert all the umd file revert all the umd file * built vue files * built vue files * Update plugins/Feedback/lang/en.json Co-authored-by: Stefan Giehl * update per review update per review * built vue files * set auto focus on modal open set auto focus on modal open * built vue files * Update FeedbackQuestion.vue add please write in english * built vue files * remove please write in English remove please write in English * built vue files * update tests and question tests update tests and question tests * set cookie in the test set cookie in the test * Update page-renderer.js add setCookie to tests * update test only load 1 update test only load 1 * built vue files * Update FeedbackQuestion_feedback_popup.png update screen shot * Update piwikHelper.js update button css * update screen shot update screen shot * Update plugins/Feedback/Feedback.php Co-authored-by: Stefan Giehl * Update plugins/Feedback/vue/src/FeedbackQuestion/FeedbackQuestion.vue Co-authored-by: Stefan Giehl * Update plugins/Feedback/API.php Co-authored-by: Stefan Giehl * Update plugins/Feedback/API.php Co-authored-by: Stefan Giehl * Update core/Plugin/API.php Co-authored-by: Stefan Giehl * update cookie and tests update cookie and tests * built vue files * test setcookie in tests test setcookie in tests * update tests update tests * update tests update tests * Update FeedbackQuestion_spec.js update cookie test * extend setCookie in test extend setCookie in test * update elints format update elints format * built vue files * test set cookie test set cookie * built vue files * Update FeedbackQuestion_spec.js set cookie after goto URL * Update FeedbackQuestion_spec.js int to string * update set cookie update set cookie * update test URL update test URL Co-authored-by: peterhashair Co-authored-by: Andrew Davis Co-authored-by: Ben Burgess <88810029+bx80@users.noreply.github.com> Co-authored-by: Stefan Giehl --- core/Date.php | 20 +- core/Piwik.php | 19 ++ plugins/CoreHome/CoreHome.php | 2 + plugins/CoreHome/vue/dist/CoreHome.umd.js | 63 ++++- plugins/CoreHome/vue/dist/CoreHome.umd.min.js | 38 +-- .../CoreHome/vue/src/CookieHelper/CookieHelper.ts | 48 ++++ .../vue/src/MatomoDialog/MatomoDialog.adapter.ts | 6 + .../CoreHome/vue/src/MatomoDialog/MatomoDialog.vue | 1 + plugins/CoreHome/vue/src/index.ts | 1 + .../CustomDimensions_report_action_subtable.png | 4 +- plugins/Feedback/API.php | 60 +++++ plugins/Feedback/Controller.php | 38 --- plugins/Feedback/Feedback.php | 135 ++++------ plugins/Feedback/ReferReminder.php | 34 --- .../feedback-popup/feedback-popup.controller.js | 42 ---- .../feedback-popup/feedback-popup.directive.html | 20 -- .../feedback-popup/feedback-popup.directive.js | 38 --- .../feedback-popup/feedback-popup.directive.less | 25 -- .../feedback-popup/review-links.directive.html | 40 --- .../refer-banner/refer-banner.controller.js | 110 -------- .../refer-banner/refer-banner.directive.html | 44 ---- .../refer-banner/refer-banner.directive.js | 28 --- .../refer-banner/refer-banner.directive.less | 48 ---- plugins/Feedback/images/facebook_logo.svg | 1 - plugins/Feedback/images/linkedin_logo.svg | 1 - plugins/Feedback/images/mastodon_logo.svg | 1 - plugins/Feedback/images/twitter_logo.svg | 1 - plugins/Feedback/lang/en.json | 19 +- plugins/Feedback/templates/feedbackPopup.twig | 1 - .../Feedback/templates/feedbackQuestionBanner.twig | 1 + plugins/Feedback/templates/index.twig | 4 - plugins/Feedback/templates/referBanner.twig | 1 - .../tests/Fixtures/FeedbackPopupFixture.php | 25 -- .../Fixtures/FeedbackQuestionBannerFixture.php | 25 ++ .../Feedback/tests/Fixtures/ReferBannerFixture.php | 25 -- .../Feedback/tests/Integration/ControllerTest.php | 116 --------- .../Feedback/tests/Integration/FeedbackTest.php | 41 +-- .../Feedback/tests/Integration/ReferBannerTest.php | 119 --------- plugins/Feedback/tests/UI/FeedbackPopup_spec.js | 46 ---- plugins/Feedback/tests/UI/FeedbackQuestion_spec.js | 52 ++++ plugins/Feedback/tests/UI/ReferBanner_spec.js | 30 --- .../UI/expected-screenshots/FeedbackForm_show.png | 4 +- .../FeedbackPopup_feedback_popup.png | 3 - .../FeedbackQuestion_feedback_banner.png | 3 + .../FeedbackQuestion_feedback_failed.png | 3 + .../FeedbackQuestion_feedback_popup.png | 3 + .../FeedbackQuestion_feedback_success.png | 3 + .../ReferBannerTest_feedback_popup.png | 3 - plugins/Feedback/vue/dist/Feedback.umd.js | 276 ++++++++++++++++++--- plugins/Feedback/vue/dist/Feedback.umd.min.js | 10 +- .../FeedbackQuestion/FeedbackQuestion.adapter.ts | 19 ++ .../vue/src/FeedbackQuestion/FeedbackQuestion.less | 34 +++ .../vue/src/FeedbackQuestion/FeedbackQuestion.vue | 169 +++++++++++++ .../Feedback/vue/src/RateFeature/RateFeature.vue | 3 - .../Feedback/vue/src/ReviewLinks/ReviewLinks.vue | 90 ------- plugins/Feedback/vue/src/index.ts | 3 +- plugins/Morpheus/fonts/matomo.svg | 1 + plugins/Morpheus/fonts/matomo.ttf | Bin 27268 -> 27416 bytes plugins/Morpheus/fonts/matomo.woff | Bin 27344 -> 27492 bytes plugins/Morpheus/fonts/matomo.woff2 | Bin 11088 -> 11172 bytes plugins/Morpheus/javascripts/piwikHelper.js | 5 + plugins/Morpheus/stylesheets/base/icons.css | 3 + plugins/Morpheus/templates/demo.twig | 3 +- plugins/Morpheus/templates/layout.twig | 1 - .../UI/expected-screenshots/Morpheus_load.png | 4 +- plugins/UsersManager/tests/System/ApiTest.php | 2 +- tests/PHPUnit/Integration/FrontControllerTest.php | 2 +- tests/PHPUnit/Unit/DateTest.php | 14 ++ tests/UI/expected-screenshots/Theme_demo.png | 4 +- ...IIntegrationTest_actions_content_piece_name.png | 4 +- .../UIIntegrationTest_api_listing.png | 4 +- .../screenshot-testing/support/page-renderer.js | 2 + 72 files changed, 923 insertions(+), 1125 deletions(-) create mode 100644 plugins/CoreHome/vue/src/CookieHelper/CookieHelper.ts delete mode 100644 plugins/Feedback/ReferReminder.php delete mode 100644 plugins/Feedback/angularjs/feedback-popup/feedback-popup.controller.js delete mode 100644 plugins/Feedback/angularjs/feedback-popup/feedback-popup.directive.html delete mode 100644 plugins/Feedback/angularjs/feedback-popup/feedback-popup.directive.js delete mode 100644 plugins/Feedback/angularjs/feedback-popup/feedback-popup.directive.less delete mode 100644 plugins/Feedback/angularjs/feedback-popup/review-links.directive.html delete mode 100644 plugins/Feedback/angularjs/refer-banner/refer-banner.controller.js delete mode 100644 plugins/Feedback/angularjs/refer-banner/refer-banner.directive.html delete mode 100644 plugins/Feedback/angularjs/refer-banner/refer-banner.directive.js delete mode 100644 plugins/Feedback/angularjs/refer-banner/refer-banner.directive.less delete mode 100644 plugins/Feedback/images/facebook_logo.svg delete mode 100644 plugins/Feedback/images/linkedin_logo.svg delete mode 100644 plugins/Feedback/images/mastodon_logo.svg delete mode 100644 plugins/Feedback/images/twitter_logo.svg delete mode 100644 plugins/Feedback/templates/feedbackPopup.twig create mode 100644 plugins/Feedback/templates/feedbackQuestionBanner.twig delete mode 100644 plugins/Feedback/templates/referBanner.twig delete mode 100644 plugins/Feedback/tests/Fixtures/FeedbackPopupFixture.php create mode 100644 plugins/Feedback/tests/Fixtures/FeedbackQuestionBannerFixture.php delete mode 100644 plugins/Feedback/tests/Fixtures/ReferBannerFixture.php delete mode 100644 plugins/Feedback/tests/Integration/ControllerTest.php delete mode 100644 plugins/Feedback/tests/Integration/ReferBannerTest.php delete mode 100644 plugins/Feedback/tests/UI/FeedbackPopup_spec.js create mode 100644 plugins/Feedback/tests/UI/FeedbackQuestion_spec.js delete mode 100644 plugins/Feedback/tests/UI/ReferBanner_spec.js delete mode 100644 plugins/Feedback/tests/UI/expected-screenshots/FeedbackPopup_feedback_popup.png create mode 100644 plugins/Feedback/tests/UI/expected-screenshots/FeedbackQuestion_feedback_banner.png create mode 100644 plugins/Feedback/tests/UI/expected-screenshots/FeedbackQuestion_feedback_failed.png create mode 100644 plugins/Feedback/tests/UI/expected-screenshots/FeedbackQuestion_feedback_popup.png create mode 100644 plugins/Feedback/tests/UI/expected-screenshots/FeedbackQuestion_feedback_success.png delete mode 100644 plugins/Feedback/tests/UI/expected-screenshots/ReferBannerTest_feedback_popup.png create mode 100644 plugins/Feedback/vue/src/FeedbackQuestion/FeedbackQuestion.adapter.ts create mode 100644 plugins/Feedback/vue/src/FeedbackQuestion/FeedbackQuestion.less create mode 100644 plugins/Feedback/vue/src/FeedbackQuestion/FeedbackQuestion.vue delete mode 100644 plugins/Feedback/vue/src/ReviewLinks/ReviewLinks.vue diff --git a/core/Date.php b/core/Date.php index 82a3df42a6..a214751b8e 100644 --- a/core/Date.php +++ b/core/Date.php @@ -41,7 +41,7 @@ class Date /** The default date time string format. */ const DATE_TIME_FORMAT = 'Y-m-d H:i:s'; - + /** Timestamp when first website came online - Tue, 06 Aug 1991 00:00:00 GMT. */ const FIRST_WEBSITE_TIMESTAMP = 681436800; @@ -155,7 +155,7 @@ class Date $date = new Date($dateString); } $timestamp = $date->getTimestamp(); - + if ($timestamp < self::FIRST_WEBSITE_TIMESTAMP) { $dateOfFirstWebsite = new self(self::FIRST_WEBSITE_TIMESTAMP); $message = Piwik::translate('General_ExceptionInvalidDateBeforeFirstWebsite', array( @@ -165,7 +165,7 @@ class Date )); throw new Exception($message . ": $dateString"); } - + if (empty($timezone)) { return $date; } @@ -985,6 +985,20 @@ class Date return new Date($ts, $this->timezone); } + /** + * Adds `$n` Month to `$this` date and returns the result in a new Date. + * instance. + * + * @param int $n Number of days to add, must be > 0. + * @return \Piwik\Date + */ + + public function addMonth($n) + { + $ts = strtotime("+$n month", $this->timestamp); + return new Date($ts, $this->timezone); + } + /** * Adds `$n` hours to `$this` date and returns the result in a new Date. * diff --git a/core/Piwik.php b/core/Piwik.php index cdcf3e196f..7151b420cc 100644 --- a/core/Piwik.php +++ b/core/Piwik.php @@ -179,6 +179,25 @@ class Piwik return $user['email'] ?? ''; } + + public static function getCurrentUserCreationData() + { + $user = APIUsersManager::getInstance()->getUser(Piwik::getCurrentUserLogin()); + return $user['date_registered'] ?? ''; + } + + /** + * Returns the current user's Last Seen. + * + * @return string + * @api + */ + public static function getCurrentUserLastSeen() + { + $user = APIUsersManager::getInstance()->getUser(Piwik::getCurrentUserLogin()); + return $user['last_seen'] ?? ''; + } + /** * Returns the email addresses configured as contact. If none is configured the mail addresses of all super users will be returned instead. * diff --git a/plugins/CoreHome/CoreHome.php b/plugins/CoreHome/CoreHome.php index ce05e819bc..731db3f565 100644 --- a/plugins/CoreHome/CoreHome.php +++ b/plugins/CoreHome/CoreHome.php @@ -417,6 +417,7 @@ class CoreHome extends \Piwik\Plugin $translationKeys[] = 'General_Error'; $translationKeys[] = 'General_ErrorRequest'; $translationKeys[] = 'General_ErrorRequestFaqLink'; + $translationKeys[] = 'General_Warning'; $translationKeys[] = 'General_YourChangesHaveBeenSaved'; $translationKeys[] = 'General_LearnMore'; $translationKeys[] = 'General_ChooseDate'; @@ -475,5 +476,6 @@ class CoreHome extends \Piwik\Plugin $translationKeys[] = 'General_PreviousPeriod'; $translationKeys[] = 'General_PreviousYear'; $translationKeys[] = 'CoreHome_ReportingCategoryHelpPrefix'; + $translationKeys[] = 'CoreHome_TechDeprecationWarning'; } } diff --git a/plugins/CoreHome/vue/dist/CoreHome.umd.js b/plugins/CoreHome/vue/dist/CoreHome.umd.js index 09505f2e1d..a572e3e558 100644 --- a/plugins/CoreHome/vue/dist/CoreHome.umd.js +++ b/plugins/CoreHome/vue/dist/CoreHome.umd.js @@ -134,6 +134,9 @@ __webpack_require__.d(__webpack_exports__, "ActivityIndicator", function() { ret __webpack_require__.d(__webpack_exports__, "translate", function() { return /* reexport */ translate; }); __webpack_require__.d(__webpack_exports__, "alertAdapter", function() { return /* reexport */ Alert_adapter; }); __webpack_require__.d(__webpack_exports__, "AjaxHelper", function() { return /* reexport */ AjaxHelper_AjaxHelper; }); +__webpack_require__.d(__webpack_exports__, "setCookie", function() { return /* reexport */ setCookie; }); +__webpack_require__.d(__webpack_exports__, "getCookie", function() { return /* reexport */ getCookie; }); +__webpack_require__.d(__webpack_exports__, "deleteCookie", function() { return /* reexport */ deleteCookie; }); __webpack_require__.d(__webpack_exports__, "MatomoUrl", function() { return /* reexport */ src_MatomoUrl_MatomoUrl; }); __webpack_require__.d(__webpack_exports__, "Matomo", function() { return /* reexport */ Matomo_Matomo; }); __webpack_require__.d(__webpack_exports__, "Periods", function() { return /* reexport */ Periods_Periods; }); @@ -2312,7 +2315,7 @@ function piwikExpandOnHover() { 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 +// 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=7aba656e var _hoisted_1 = { ref: "root" @@ -2320,7 +2323,7 @@ var _hoisted_1 = { function render(_ctx, _cache, $props, $setup, $data, $options) { return Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withDirectives"])((Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("div", _hoisted_1, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["renderSlot"])(_ctx.$slots, "default")], 512)), [[external_commonjs_vue_commonjs2_vue_root_Vue_["vShow"], _ctx.modelValue]]); } -// CONCATENATED MODULE: ./plugins/CoreHome/vue/src/MatomoDialog/MatomoDialog.vue?vue&type=template&id=15ad69b4 +// CONCATENATED MODULE: ./plugins/CoreHome/vue/src/MatomoDialog/MatomoDialog.vue?vue&type=template&id=7aba656e // 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/MatomoDialog/MatomoDialog.vue?vue&type=script&lang=ts @@ -2363,6 +2366,9 @@ function render(_ctx, _cache, $props, $setup, $data, $options) { }, no: function no() { _this.$emit('no'); + }, + validation: function validation() { + _this.$emit('validation'); } }, { onCloseEnd: function onCloseEnd() { @@ -2641,6 +2647,14 @@ function createAngularJsAdapter(options) { }, 0); } }, + validation: function validation($event, scope, element, attrs) { + if (attrs.no) { + scope.$eval(attrs.no); + setTimeout(function () { + scope.$apply(); + }, 0); + } + }, close: function close($event, scope, element, attrs) { if (attrs.close) { scope.$eval(attrs.close); @@ -4865,6 +4879,50 @@ Alertvue_type_script_lang_ts.render = Alertvue_type_template_id_c3863ae2_render directiveName: 'piwikAlert', transclude: true })); +// CONCATENATED MODULE: ./plugins/CoreHome/vue/src/CookieHelper/CookieHelper.ts +/* + * General utils for managing cookies in Typescript. + */ +// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types +function setCookie(name, val, seconds) { + var date = new Date(); // set default day to 3 days + + if (!seconds) { + // eslint-disable-next-line no-param-reassign + seconds = 3 * 24 * 60 * 1000; + } // Set it expire in n days + + + date.setTime(date.getTime() + seconds); // Set it + + document.cookie = "".concat(name, "=").concat(val, "; expires=").concat(date.toUTCString(), "; path=/"); +} // eslint-disable-next-line consistent-return,@typescript-eslint/explicit-module-boundary-types + +function getCookie(name) { + var value = "; ".concat(document.cookie); + var parts = value.split("; ".concat(name, "=")); // if cookie not exist return null + // eslint-disable-next-line eqeqeq + + if (parts.length == 2) { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + var data = parts.pop().split(';').shift(); + + if (typeof data !== 'undefined') { + return data; + } + } + + return null; +} // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types + +function deleteCookie(name) { + var date = new Date(); // Set it expire in -1 days + + date.setTime(date.getTime() + -1 * 24 * 60 * 60 * 1000); // Set it + + document.cookie = "".concat(name, "=; expires=").concat(date.toUTCString(), "; path=/"); +} // CONCATENATED MODULE: ./plugins/CoreHome/vue/src/index.ts /*! * Matomo - free/libre analytics platform @@ -4915,6 +4973,7 @@ 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 24533c5ea8..0fe81a6b4c 100644 --- a/plugins/CoreHome/vue/dist/CoreHome.umd.min.js +++ b/plugins/CoreHome/vue/dist/CoreHome.umd.min.js @@ -4,13 +4,13 @@ * * @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 yt})),n.d(t,"activityIndicatorAdapter",(function(){return br})),n.d(t,"ActivityIndicator",(function(){return gr})),n.d(t,"translate",(function(){return C})),n.d(t,"alertAdapter",(function(){return Or})),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 R})),n.d(t,"format",(function(){return P})),n.d(t,"getToday",(function(){return S})),n.d(t,"parseDate",(function(){return E})),n.d(t,"todayIsInRange",(function(){return T})),n.d(t,"Dropdown",(function(){return Ae})),n.d(t,"FocusAnywhereButHere",(function(){return Re})),n.d(t,"FocusIf",(function(){return _e})),n.d(t,"MatomoDialog",(function(){return ct})),n.d(t,"ExpandOnClick",(function(){return Ke})),n.d(t,"ExpandOnHover",(function(){return at})),n.d(t,"EnrichedHeadline",(function(){return Mt})),n.d(t,"ContentBlock",(function(){return qt})),n.d(t,"Comparisons",(function(){return In})),n.d(t,"Menudropdown",(function(){return Gn})),n.d(t,"DatePicker",(function(){return nr})),n.d(t,"DateRangePicker",(function(){return lr})),n.d(t,"PeriodDatePicker",(function(){return pr})),"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;ne.length)&&(t=e.length);for(var n=0,r=new Array(t);ne.length)&&(t=e.length);for(var n=0,r=new Array(t);n1?t-1:0),r=1;r=e[0]&&S()<=e[1])}function x(e,t){return M(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=e[0]&&S()<=e[1])}function x(e,t){return M(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);n1&&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 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:P,RangePeriod:R,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;n1&&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 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:P,RangePeriod:R,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=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=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;re.length)&&(t=e.length);for(var n=0,r=new Array(t);ne.length)&&(t=e.length);for(var n=0,r=new Array(t);n')),l}return Object.entries(r).forEach((function(e){var t=ut(e,2),n=t[0],r=t[1];r.vue||(r.vue=n),r.angularJsBind&&(v[n]=r.angularJsBind)})),g.$inject=l||[],angular.module("piwikApp").directive(s,g),g} + */var vt=0;function gt(e){return e.substring(0,1).toLowerCase()+e.substring(1).replace(/[A-Z]/g,(function(e){return"-".concat(e.toLowerCase())}))}function bt(e){return e.substring(0,1).toLowerCase()+e.substring(1).replace(/-([a-z])/g,(function(e,t){return t.toUpperCase()}))}function yt(e){var t=e.component,n=e.scope,r=void 0===n?{}:n,a=e.events,i=void 0===a?{}:a,l=e.$inject,c=e.directiveName,s=e.transclude,u=e.mountPointFactory,d=e.postCreate,p=e.noScope,f=e.restrict,m=void 0===f?"A":f,h=vt;s&&(vt+=1);var v={};function g(){for(var e=arguments.length,n=new Array(e),a=0;a')),l}return Object.entries(r).forEach((function(e){var t=ut(e,2),n=t[0],r=t[1];r.vue||(r.vue=n),r.angularJsBind&&(v[n]=r.angularJsBind)})),g.$inject=l||[],angular.module("piwikApp").directive(c,g),g} /*! * Matomo - free/libre analytics platform * * @link https://matomo.org * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later - */yt({component:ct,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=$('
');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 wt={key:0,class:"title",tabindex:"6"},kt=["href","title"],Dt={class:"iconsBar"},Ot=["href","title"],jt=Object(o["createElementVNode"])("span",{class:"icon-help"},null,-1),Ct=[jt],Pt=["title"],St=Object(o["createElementVNode"])("span",{class:"icon-info"},null,-1),Et=[St],Tt={class:"ratingIcons"},xt={class:"inlineHelp"},It=["innerHTML"],Ht=["href"];function $t(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",wt,[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,kt)):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")},Ct,8,Ot)):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,Pt)):Object(o["createCommentVNode"])("",!0),Object(o["createElementVNode"])("div",Tt,[Object(o["createVNode"])(l,{title:e.actualFeatureName},null,8,["title"])])],512),[[o["vShow"],e.showIcons||e.showInlineHelp]]),Object(o["withDirectives"])(Object(o["createElementVNode"])("div",xt,[Object(o["createElementVNode"])("div",{innerHTML:e.$sanitize(e.actualInlineHelp)},null,8,It),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,Ht)):Object(o["createCommentVNode"])("",!0)],512),[[o["vShow"],e.showInlineHelp]])],544)}var At=Object(o["defineAsyncComponent"])((function(){return new Promise((function(e){window.$(document).ready((function(){e(window.Feedback.RateFeature)}))}))})),Bt=Object(o["defineComponent"])({props:{helpUrl:{type:String,default:""},editUrl:{type:String,default:""},reportGenerated:String,featureName:String,inlineHelp:String},components:{RateFeature:At},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="

".concat(r,"

"),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})}))}});Bt.render=$t;var Mt=Bt,Nt=(yt({component:Mt,scope:{helpUrl:{angularJsBind:"@"},editUrl:{angularJsBind:"@"},reportGenerated:{angularJsBind:"@?"},featureName:{angularJsBind:"@"},inlineHelp:{angularJsBind:"@?"}},directiveName:"piwikEnrichedHeadline",transclude:!0}),{class:"card",ref:"root"}),Ft={class:"card-content"},Vt={key:0,class:"card-title"},Lt={key:1,class:"card-title"},Rt={ref:"content"}; + */yt({component:st,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))},validation: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=$('
');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 wt={key:0,class:"title",tabindex:"6"},kt=["href","title"],Dt={class:"iconsBar"},Ot=["href","title"],jt=Object(o["createElementVNode"])("span",{class:"icon-help"},null,-1),Ct=[jt],Pt=["title"],St=Object(o["createElementVNode"])("span",{class:"icon-info"},null,-1),Et=[St],Tt={class:"ratingIcons"},xt={class:"inlineHelp"},It=["innerHTML"],$t=["href"];function Ht(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",wt,[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,kt)):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")},Ct,8,Ot)):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,Pt)):Object(o["createCommentVNode"])("",!0),Object(o["createElementVNode"])("div",Tt,[Object(o["createVNode"])(l,{title:e.actualFeatureName},null,8,["title"])])],512),[[o["vShow"],e.showIcons||e.showInlineHelp]]),Object(o["withDirectives"])(Object(o["createElementVNode"])("div",xt,[Object(o["createElementVNode"])("div",{innerHTML:e.$sanitize(e.actualInlineHelp)},null,8,It),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,$t)):Object(o["createCommentVNode"])("",!0)],512),[[o["vShow"],e.showInlineHelp]])],544)}var At=Object(o["defineAsyncComponent"])((function(){return new Promise((function(e){window.$(document).ready((function(){e(window.Feedback.RateFeature)}))}))})),Bt=Object(o["defineComponent"])({props:{helpUrl:{type:String,default:""},editUrl:{type:String,default:""},reportGenerated:String,featureName:String,inlineHelp:String},components:{RateFeature:At},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="

".concat(r,"

"),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})}))}});Bt.render=Ht;var Mt=Bt,Nt=(yt({component:Mt,scope:{helpUrl:{angularJsBind:"@"},editUrl:{angularJsBind:"@"},reportGenerated:{angularJsBind:"@?"},featureName:{angularJsBind:"@"},inlineHelp:{angularJsBind:"@?"}},directiveName:"piwikEnrichedHeadline",transclude:!0}),{class:"card",ref:"root"}),Ft={class:"card-content"},Vt={key:0,class:"card-title"},Lt={key:1,class:"card-title"},Rt={ref:"content"}; /*! * Matomo - free/libre analytics platform * @@ -195,25 +195,25 @@ function ot(){return{restrict:"A",link:function(e,t){var n={instance:null,value: * * @link https://matomo.org * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later - */var Wt=function(){function e(){var t=this;Gt(this,e),Yt(this,"segmentState",Object(o["reactive"])({availableSegments:[]})),j.on("piwikSegmentationInited",(function(){return t.setSegmentState()}))}return zt(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}(),Kt=new Wt;function Xt(e){return nn(e)||tn(e)||en(e)||Zt()}function Zt(){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 en(e,t){if(e){if("string"===typeof e)return rn(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)?rn(e,t):void 0}}function tn(e){if("undefined"!==typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}function nn(e){if(Array.isArray(e))return rn(e)}function rn(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);ne.length)&&(t=e.length);for(var n=0,r=new Array(t);n1||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)%dn;if(0===n)return this.colors["series".concat(r)];var a=n%pn;return this.colors["series".concat(r,"-shade").concat(a)]}},{key:"getSeriesColorName",value:function(e,t){var n="series".concat(e%dn);return t>0&&(n+="-shade".concat(t%pn)),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:on(on({},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=Xt(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=on(on(on({},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(){var e=j.ColorManager;if(!e)return[];for(var t=[],n=0;n"+decodeURIComponent(t.params.segment)},[Object(o["createElementVNode"])("a",{target:"_blank",href:e.getUrlToSegment(t.params.segment)},Object(o["toDisplayString"])(t.title),9,yn)],8,bn),(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",kn,Object(o["toDisplayString"])(n.title)+" ("+Object(o["toDisplayString"])(e.getComparisonPeriodType(n))+") ",1)],8,wn)})),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,On)],8,Dn)):Object(o["createCommentVNode"])("",!0)])})),128)),Object(o["createElementVNode"])("div",jn,[Object(o["createElementVNode"])("img",{src:"plugins/Morpheus/images/loading-blue.gif",alt:e.translate("General_LoadingData")},null,8,Cn),Object(o["createTextVNode"])(" "+Object(o["toDisplayString"])(e.translate("General_LoadingData")),1)])],512)):Object(o["createCommentVNode"])("",!0)}function Sn(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 En(e){for(var t=1;t"))},show:{delay:200,duration:200},hide:!1})},onComparisonsChanged:function(){var e=this;if(this.comparisonTooltips=null,hn.isComparing()){var t=hn.getPeriodComparisons(),n=hn.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=hn.getComparisonSeriesIndex(t.index,0),a=e.reportData.comparisons[r],o=hn.getComparisonSeriesIndex(t.index,n.index),i=e.reportData.comparisons[o],l=e.reportData.comparisons[n.index],s='
',c=(i.nb_visits/a.nb_visits*100).toFixed(2);return c="".concat(c,"%"),s+=C("General_ComparisonCardTooltip1",["'".concat(i.compareSegmentPretty,"'"),i.comparePeriodPretty,c,i.nb_visits.toString(),a.nb_visits.toString()]),t.index>0&&(s+="

",s+=C("General_ComparisonCardTooltip2",[i.nb_visits_change.toString(),l.compareSegmentPretty,l.comparePeriodPretty])),s+="
",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){}}});xn.render=Pn;var In=xn; + */var dn=8,pn=3;function fn(e){return e?e instanceof Array?e:[e]:[]}var mn=function(){function e(){var t=this;ln(this,e),un(this,"privateState",Object(o["reactive"])({comparisonsDisabledFor:[]})),un(this,"state",Object(o["readonly"])(this.privateState)),un(this,"colors",{}),un(this,"segmentComparisons",Object(o["computed"])((function(){return t.parseSegmentComparisons()}))),un(this,"periodComparisons",Object(o["computed"])((function(){return t.parsePeriodComparisons()}))),un(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 sn(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)%dn;if(0===n)return this.colors["series".concat(r)];var a=n%pn;return this.colors["series".concat(r,"-shade").concat(a)]}},{key:"getSeriesColorName",value:function(e,t){var n="series".concat(e%dn);return t>0&&(n+="-shade".concat(t%pn)),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:on(on({},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=Xt(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=[],c=[];Object.keys(a).forEach((function(e){var t=e.split("|");l.push(t[0]),c.push(t[1])}));var s={compareSegments:Object.keys(r),comparePeriods:l,compareDates:c};if(j.helper.isAngularRenderingThePage()){var u=ke.hashParsed.value,d=on(on(on({},u),s),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){s[e].length||p.push(e)}));var f=ke.stringify(n),m=ke.stringify(s);window.broadcast.propagateNewPage(f,void 0,m,p)}},{key:"getAllSeriesColors",value:function(){var e=j.ColorManager;if(!e)return[];for(var t=[],n=0;n"+decodeURIComponent(t.params.segment)},[Object(o["createElementVNode"])("a",{target:"_blank",href:e.getUrlToSegment(t.params.segment)},Object(o["toDisplayString"])(t.title),9,yn)],8,bn),(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",kn,Object(o["toDisplayString"])(n.title)+" ("+Object(o["toDisplayString"])(e.getComparisonPeriodType(n))+") ",1)],8,wn)})),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,On)],8,Dn)):Object(o["createCommentVNode"])("",!0)])})),128)),Object(o["createElementVNode"])("div",jn,[Object(o["createElementVNode"])("img",{src:"plugins/Morpheus/images/loading-blue.gif",alt:e.translate("General_LoadingData")},null,8,Cn),Object(o["createTextVNode"])(" "+Object(o["toDisplayString"])(e.translate("General_LoadingData")),1)])],512)):Object(o["createCommentVNode"])("",!0)}function Sn(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 En(e){for(var t=1;t"))},show:{delay:200,duration:200},hide:!1})},onComparisonsChanged:function(){var e=this;if(this.comparisonTooltips=null,hn.isComparing()){var t=hn.getPeriodComparisons(),n=hn.getSegmentComparisons();$e.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=hn.getComparisonSeriesIndex(t.index,0),a=e.reportData.comparisons[r],o=hn.getComparisonSeriesIndex(t.index,n.index),i=e.reportData.comparisons[o],l=e.reportData.comparisons[n.index],c='
',s=(i.nb_visits/a.nb_visits*100).toFixed(2);return s="".concat(s,"%"),c+=C("General_ComparisonCardTooltip1",["'".concat(i.compareSegmentPretty,"'"),i.comparePeriodPretty,s,i.nb_visits.toString(),a.nb_visits.toString()]),t.index>0&&(c+="

",c+=C("General_ComparisonCardTooltip2",[i.nb_visits_change.toString(),l.compareSegmentPretty,l.comparePeriodPretty])),c+="
",c}},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){}}});xn.render=Pn;var In=xn; /*! * Matomo - free/libre analytics platform * * @link https://matomo.org * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later - */function Hn(){return hn}Hn.$inject=[],angular.module("piwikApp.service").factory("piwikComparisonsService",Hn);yt({component:In,directiveName:"piwikComparisons",restrict:"E"});var $n={ref:"root",class:"menuDropdown"},An=["title"],Bn=["innerHTML"],Mn=Object(o["createElementVNode"])("span",{class:"icon-arrow-bottom"},null,-1),Nn={class:"items"},Fn={key:0,class:"search"},Vn=["placeholder"],Ln=["title"],Rn=["title"];function Un(e,t,n,r,a,i){var l=Object(o["resolveDirective"])("focus-anywhere-but-here");return Object(o["withDirectives"])((Object(o["openBlock"])(),Object(o["createElementBlock"])("div",$n,[Object(o["createElementVNode"])("span",{class:"title",onClick:t[0]||(t[0]=function(t){return e.showItems=!e.showItems}),title:e.tooltip},[Object(o["createElementVNode"])("span",{innerHTML:e.$sanitize(this.actualMenuTitle)},null,8,Bn),Mn],8,An),Object(o["withDirectives"])(Object(o["createElementVNode"])("div",Nn,[e.showSearch&&e.showItems?(Object(o["openBlock"])(),Object(o["createElementBlock"])("div",Fn,[Object(o["withDirectives"])(Object(o["createElementVNode"])("input",{type:"text","onUpdate:modelValue":t[1]||(t[1]=function(t){return e.searchTerm=t}),onKeydown:t[2]||(t[2]=function(t){return e.onSearchTermKeydown(t)}),placeholder:e.translate("General_Search")},null,40,Vn),[[o["vModelText"],e.searchTerm]]),Object(o["withDirectives"])(Object(o["createElementVNode"])("img",{class:"search_ico",src:"plugins/Morpheus/images/search_ico.png",title:e.translate("General_Search")},null,8,Ln),[[o["vShow"],!e.searchTerm]]),Object(o["withDirectives"])(Object(o["createElementVNode"])("img",{onClick:t[3]||(t[3]=function(t){e.searchTerm="",e.searchItems("")}),class:"reset",src:"plugins/CoreHome/images/reset_search.png",title:e.translate("General_Clear")},null,8,Rn),[[o["vShow"],e.searchTerm]])])):Object(o["createCommentVNode"])("",!0),Object(o["createElementVNode"])("div",{onClick:t[4]||(t[4]=function(t){return e.selectItem(t)})},[Object(o["renderSlot"])(e.$slots,"default")])],512),[[o["vShow"],e.showItems]])],512)),[[l,{blur:e.lostFocus}]])}var _n=window,Jn=_n.$,qn=Object(o["defineComponent"])({props:{menuTitle:String,tooltip:String,showSearch:Boolean,menuTitleChangeOnClick:String},directives:{FocusAnywhereButHere:Re,FocusIf:_e},emits:["afterSelect"],watch:{menuTitle:function(){this.actualMenuTitle=this.menuTitle}},data:function(){return{showItems:!1,searchTerm:"",actualMenuTitle:this.menuTitle}},methods:{lostFocus:function(){this.showItems=!1},selectItem:function(e){var t=e.target.classList;!t.contains("item")||t.contains("disabled")||t.contains("separator")||(!1!==this.menuTitleChangeOnClick&&(this.actualMenuTitle=e.target.textContent.replace(/[\u0000-\u2666]/g,(function(e){return"&#".concat(e.charCodeAt(0),";")}))),this.showItems=!1,Jn(this.$slots.default()).find(".item").removeClass("active"),t.add("active"),this.$emit("afterSelect"))},onSearchTermKeydown:function(){var e=this;setTimeout((function(){e.searchItems(e.searchTerm)}))},searchItems:function(e){var t=e.toLowerCase();Jn(this.$refs.root).find(".item").each((function(e,n){var r=Jn(n);-1===r.text().toLowerCase().indexOf(t)?r.hide():r.show()}))}}});qn.render=Un;var Gn=qn,Qn=(yt({component:Gn,scope:{menuTitle:{angularJsBind:"@"},tooltip:{angularJsBind:"@"},showSearch:{angularJsBind:"="},menuTitleChangeOnClick:{angularJsBind:"="}},directiveName:"piwikMenudropdown",transclude:!0,events:{"after-select":function(e,t){setTimeout((function(){t.$apply()}),0)}}}),{ref:"root"}); + */function $n(){return hn}$n.$inject=[],angular.module("piwikApp.service").factory("piwikComparisonsService",$n);yt({component:In,directiveName:"piwikComparisons",restrict:"E"});var Hn={ref:"root",class:"menuDropdown"},An=["title"],Bn=["innerHTML"],Mn=Object(o["createElementVNode"])("span",{class:"icon-arrow-bottom"},null,-1),Nn={class:"items"},Fn={key:0,class:"search"},Vn=["placeholder"],Ln=["title"],Rn=["title"];function Un(e,t,n,r,a,i){var l=Object(o["resolveDirective"])("focus-anywhere-but-here");return Object(o["withDirectives"])((Object(o["openBlock"])(),Object(o["createElementBlock"])("div",Hn,[Object(o["createElementVNode"])("span",{class:"title",onClick:t[0]||(t[0]=function(t){return e.showItems=!e.showItems}),title:e.tooltip},[Object(o["createElementVNode"])("span",{innerHTML:e.$sanitize(this.actualMenuTitle)},null,8,Bn),Mn],8,An),Object(o["withDirectives"])(Object(o["createElementVNode"])("div",Nn,[e.showSearch&&e.showItems?(Object(o["openBlock"])(),Object(o["createElementBlock"])("div",Fn,[Object(o["withDirectives"])(Object(o["createElementVNode"])("input",{type:"text","onUpdate:modelValue":t[1]||(t[1]=function(t){return e.searchTerm=t}),onKeydown:t[2]||(t[2]=function(t){return e.onSearchTermKeydown(t)}),placeholder:e.translate("General_Search")},null,40,Vn),[[o["vModelText"],e.searchTerm]]),Object(o["withDirectives"])(Object(o["createElementVNode"])("img",{class:"search_ico",src:"plugins/Morpheus/images/search_ico.png",title:e.translate("General_Search")},null,8,Ln),[[o["vShow"],!e.searchTerm]]),Object(o["withDirectives"])(Object(o["createElementVNode"])("img",{onClick:t[3]||(t[3]=function(t){e.searchTerm="",e.searchItems("")}),class:"reset",src:"plugins/CoreHome/images/reset_search.png",title:e.translate("General_Clear")},null,8,Rn),[[o["vShow"],e.searchTerm]])])):Object(o["createCommentVNode"])("",!0),Object(o["createElementVNode"])("div",{onClick:t[4]||(t[4]=function(t){return e.selectItem(t)})},[Object(o["renderSlot"])(e.$slots,"default")])],512),[[o["vShow"],e.showItems]])],512)),[[l,{blur:e.lostFocus}]])}var _n=window,Jn=_n.$,qn=Object(o["defineComponent"])({props:{menuTitle:String,tooltip:String,showSearch:Boolean,menuTitleChangeOnClick:String},directives:{FocusAnywhereButHere:Re,FocusIf:_e},emits:["afterSelect"],watch:{menuTitle:function(){this.actualMenuTitle=this.menuTitle}},data:function(){return{showItems:!1,searchTerm:"",actualMenuTitle:this.menuTitle}},methods:{lostFocus:function(){this.showItems=!1},selectItem:function(e){var t=e.target.classList;!t.contains("item")||t.contains("disabled")||t.contains("separator")||(!1!==this.menuTitleChangeOnClick&&(this.actualMenuTitle=e.target.textContent.replace(/[\u0000-\u2666]/g,(function(e){return"&#".concat(e.charCodeAt(0),";")}))),this.showItems=!1,Jn(this.$slots.default()).find(".item").removeClass("active"),t.add("active"),this.$emit("afterSelect"))},onSearchTermKeydown:function(){var e=this;setTimeout((function(){e.searchItems(e.searchTerm)}))},searchItems:function(e){var t=e.toLowerCase();Jn(this.$refs.root).find(".item").each((function(e,n){var r=Jn(n);-1===r.text().toLowerCase().indexOf(t)?r.hide():r.show()}))}}});qn.render=Un;var Gn=qn,Qn=(yt({component:Gn,scope:{menuTitle:{angularJsBind:"@"},tooltip:{angularJsBind:"@"},showSearch:{angularJsBind:"="},menuTitleChangeOnClick:{angularJsBind:"="}},directiveName:"piwikMenudropdown",transclude:!0,events:{"after-select":function(e,t){setTimeout((function(){t.$apply()}),0)}}}),{ref:"root"}); /*! * Matomo - free/libre analytics platform * * @link https://matomo.org * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later - */function zn(e,t,n,r,a,i){return Object(o["openBlock"])(),Object(o["createElementBlock"])("div",Qn,null,512)}function Yn(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 Wn(e){for(var t=1;t=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=er(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=er(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(er(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=er(n.value),a=l();return(a[0]!==t.getMonth()||a[1]!==t.getFullYear())&&(r.datepicker("setDate",t),!0)}function u(){var e=er(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=er(n.value),r=e.stepMonths||Xn;if(t.datepicker("option","stepMonths")===r)return!1;var a=er(".ui-datepicker-month",t).val(),o=er(".ui-datepicker-year",t).val();return t.datepicker("option","stepMonths",r).datepicker("setDate",new Date(o,a)),u(),!0}function p(){var t=er(n.value);t.find(".ui-datepicker-month").attr("disabled",e.disableMonthDropdown)}function f(){if(er(this).hasClass("ui-state-hover")){var e=er(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 Wn({},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=er(n.value),o=e.options||{},i=Wn(Wn(Wn({},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=er(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=er(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=er(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}}});tr.render=zn;var nr=tr,rr=(yt({component:nr,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"}),ar={id:"calendarRangeTo"}; + */function zn(e,t,n,r,a,i){return Object(o["openBlock"])(),Object(o["createElementBlock"])("div",Qn,null,512)}function Yn(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 Wn(e){for(var t=1;t=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 c=o.children("td:not(.ui-datepicker-other-month)").last();return r=a(c,t,n),r.setDate(r.getDate()+i.index(e)-i.index(c)),r}function l(){var e=er(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 c(){var e=er(n.value),t=e.find(".ui-datepicker-calendar"),o=l(),i=t.find("td"),c=i.first(),s=a(c,o[0],o[1]);i.each((function(){r(er(this),s),s.setDate(s.getDate()+1)}))}function s(){var t=e.viewDate;if(!t)return!1;if(!(t instanceof Date))try{t=E(t)}catch(o){return!1}var r=er(n.value),a=l();return(a[0]!==t.getMonth()||a[1]!==t.getFullYear())&&(r.datepicker("setDate",t),!0)}function u(){var e=er(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=er(n.value),r=e.stepMonths||Xn;if(t.datepicker("option","stepMonths")===r)return!1;var a=er(".ui-datepicker-month",t).val(),o=er(".ui-datepicker-year",t).val();return t.datepicker("option","stepMonths",r).datepicker("setDate",new Date(o,a)),u(),!0}function p(){var t=er(n.value);t.find(".ui-datepicker-month").attr("disabled",e.disableMonthDropdown)}function f(){if(er(this).hasClass("ui-state-hover")){var e=er(this).parent(),t=e.parent();e.is(":first-child")?t.find("a").first().click():t.find("a").last().click()}}function m(){p(),c()}return Object(o["watch"])((function(){return Wn({},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&&s()&&(n=!0),e.stepMonths!==t.stepMonths&&d(),e.enableDisableMonthDropdown!==t.enableDisableMonthDropdown&&p(),n&&c()})),Object(o["onMounted"])((function(){var r=er(n.value),o=e.options||{},i=Wn(Wn(Wn({},j.getBaseDatePickerOptions()),o),{},{onChangeMonthYear:function(){setTimeout((function(){u()}))}});r.datepicker(i),r.on("mouseover","tbody td a",(function(e){e.originalEvent&&c()})),r.on("mouseenter","tbody td",(function(){var e=l(),n=er(this),r=a(n,e[0],e[1]);t.emit("cellHover",{date:r,$cell:n})})),r.on("mouseout","tbody td a",(function(){c()})),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=er(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=er(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();s(),p(),h||u(),c()})),{root:n}}});tr.render=zn;var nr=tr,rr=(yt({component:nr,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"}),ar={id:"calendarRangeTo"}; /*! * Matomo - free/libre analytics platform * @@ -225,7 +225,7 @@ function ot(){return{restrict:"A",link:function(e,t){var n={instance:null,value: * * @link https://matomo.org * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later - */yt({component:lr,scope:{startDate:{angularJsBind:"<"},endDate:{angularJsBind:"<"},rangeChange:{angularJsBind:"&"},submit:{angularJsBind:"&"}},directiveName:"piwikDateRangePicker",restrict:"E"});function sr(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 cr=new Date(j.minDateYear,j.minDateMonth-1,j.minDateDay),ur=new Date(j.maxDateYear,j.maxDateMonth-1,j.maxDateDay),dr=Object(o["defineComponent"])({props:{period:String,date:[String,Date]},components:{DatePicker:nr},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]=crn[1]?n[1]:ur,n}function l(t,n){var r=tur,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}}});dr.render=sr;var pr=dr,fr=(yt({component:pr,scope:{period:{angularJsBind:"<"},date:{angularJsBind:"<"},select:{angularJsBind:"&"}},directiveName:"piwikPeriodDatePicker",restrict:"E"}),{class:"loadingPiwik"}),mr=Object(o["createElementVNode"])("img",{src:"plugins/Morpheus/images/loading-blue.gif",alt:""},null,-1); + */yt({component:lr,scope:{startDate:{angularJsBind:"<"},endDate:{angularJsBind:"<"},rangeChange:{angularJsBind:"&"},submit:{angularJsBind:"&"}},directiveName:"piwikDateRangePicker",restrict:"E"});function cr(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 sr=new Date(j.minDateYear,j.minDateMonth-1,j.minDateDay),ur=new Date(j.maxDateYear,j.maxDateMonth-1,j.maxDateDay),dr=Object(o["defineComponent"])({props:{period:String,date:[String,Date]},components:{DatePicker:nr},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]=srn[1]?n[1]:ur,n}function l(t,n){var r=tur,o=n.hasClass("ui-datepicker-other-month")&&("month"===e.period||"day"===e.period);a.value=r||o?[null,null]:i(t)}function c(){a.value=[null,null]}function s(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:c,onDateSelected:s}}});dr.render=cr;var pr=dr,fr=(yt({component:pr,scope:{period:{angularJsBind:"<"},date:{angularJsBind:"<"},select:{angularJsBind:"&"}},directiveName:"piwikPeriodDatePicker",restrict:"E"}),{class:"loadingPiwik"}),mr=Object(o["createElementVNode"])("img",{src:"plugins/Morpheus/images/loading-blue.gif",alt:""},null,-1); /*! * Matomo - free/libre analytics platform * @@ -238,6 +238,12 @@ function ot(){return{restrict:"A",link:function(e,t){var n={instance:null,value: * @link https://matomo.org * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later */function yr(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function wr(e,t,n,r,a,i){return Object(o["openBlock"])(),Object(o["createElementBlock"])("div",{class:Object(o["normalizeClass"])(["alert",yr({},"alert-".concat(e.severity),!0)])},[Object(o["renderSlot"])(e.$slots,"default")],2)}var kr=Object(o["defineComponent"])({props:{severity:{type:String,required:!0}}});kr.render=wr;var Dr=kr,Or=yt({component:Dr,scope:{severity:{vue:"severity",angularJsBind:"@piwikAlert"}},directiveName:"piwikAlert",transclude:!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 jr(e,t,n){var r=new Date;n||(n=432e4),r.setTime(r.getTime()+n),document.cookie="".concat(e,"=").concat(t,"; expires=").concat(r.toUTCString(),"; path=/")}function Cr(e){var t="; ".concat(document.cookie),n=t.split("; ".concat(e,"="));if(2==n.length){var r=n.pop().split(";").shift();if("undefined"!==typeof r)return r}return null}function Pr(e){var t=new Date;t.setTime(t.getTime()+-864e5),document.cookie="".concat(e,"=; expires=").concat(t.toUTCString(),"; path=/")} /*! * Matomo - free/libre analytics platform * diff --git a/plugins/CoreHome/vue/src/CookieHelper/CookieHelper.ts b/plugins/CoreHome/vue/src/CookieHelper/CookieHelper.ts new file mode 100644 index 0000000000..78855f3be2 --- /dev/null +++ b/plugins/CoreHome/vue/src/CookieHelper/CookieHelper.ts @@ -0,0 +1,48 @@ +/* + * General utils for managing cookies in Typescript. + */ + +// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types +export function setCookie(name: string, val: string, seconds: number) { + const date = new Date(); + + // set default day to 3 days + if (!seconds) { + // eslint-disable-next-line no-param-reassign + seconds = 3 * 24 * 60 * 1000; + } + // Set it expire in n days + date.setTime(date.getTime() + (seconds)); + + // Set it + document.cookie = `${name}=${val}; expires=${date.toUTCString()}; path=/`; +} + +// eslint-disable-next-line consistent-return,@typescript-eslint/explicit-module-boundary-types +export function getCookie(name: string) { + const value = `; ${document.cookie}`; + const parts = value.split(`; ${name}=`); + + // if cookie not exist return null + // eslint-disable-next-line eqeqeq + if (parts.length == 2) { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + const data = parts.pop().split(';').shift(); + if (typeof data !== 'undefined') { + return data; + } + } + return null; +} + +// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types +export function deleteCookie(name: string) { + const date = new Date(); + + // Set it expire in -1 days + date.setTime(date.getTime() + (-1 * 24 * 60 * 60 * 1000)); + + // Set it + document.cookie = `${name}=; expires=${date.toUTCString()}; path=/`; +} diff --git a/plugins/CoreHome/vue/src/MatomoDialog/MatomoDialog.adapter.ts b/plugins/CoreHome/vue/src/MatomoDialog/MatomoDialog.adapter.ts index 659bcaa97e..ee03ce55c7 100644 --- a/plugins/CoreHome/vue/src/MatomoDialog/MatomoDialog.adapter.ts +++ b/plugins/CoreHome/vue/src/MatomoDialog/MatomoDialog.adapter.ts @@ -34,6 +34,12 @@ export default createAngularJsAdapter<[IParseService]>({ setTimeout(() => { scope.$apply(); }, 0); } }, + validation: ($event, scope, element, attrs) => { + if (attrs.no) { + scope.$eval(attrs.no); + setTimeout(() => { scope.$apply(); }, 0); + } + }, close: ($event, scope, element, attrs) => { if (attrs.close) { scope.$eval(attrs.close); diff --git a/plugins/CoreHome/vue/src/MatomoDialog/MatomoDialog.vue b/plugins/CoreHome/vue/src/MatomoDialog/MatomoDialog.vue index 81a232f4ba..76c12c5807 100644 --- a/plugins/CoreHome/vue/src/MatomoDialog/MatomoDialog.vue +++ b/plugins/CoreHome/vue/src/MatomoDialog/MatomoDialog.vue @@ -46,6 +46,7 @@ export default defineComponent({ Matomo.helper.modalConfirm(slotElement, { yes: () => { this.$emit('yes'); }, no: () => { this.$emit('no'); }, + validation: () => { this.$emit('validation'); }, }, { onCloseEnd: () => { // materialize removes the child element, so we move it back to the slot diff --git a/plugins/CoreHome/vue/src/index.ts b/plugins/CoreHome/vue/src/index.ts index 0374f04f91..4755fabc73 100644 --- a/plugins/CoreHome/vue/src/index.ts +++ b/plugins/CoreHome/vue/src/index.ts @@ -35,6 +35,7 @@ export { default as ActivityIndicator } from './ActivityIndicator/ActivityIndica export { default as translate } from './translate'; export { default as alertAdapter } from './Alert/Alert.adapter'; export { default as AjaxHelper } from './AjaxHelper/AjaxHelper'; +export { setCookie, getCookie, deleteCookie } from './CookieHelper/CookieHelper'; export { default as MatomoUrl } from './MatomoUrl/MatomoUrl'; export { default as Matomo } from './Matomo/Matomo'; export * from './Periods'; diff --git a/plugins/CustomDimensions/tests/UI/expected-screenshots/CustomDimensions_report_action_subtable.png b/plugins/CustomDimensions/tests/UI/expected-screenshots/CustomDimensions_report_action_subtable.png index 6765908e4c..8585f0254d 100644 --- a/plugins/CustomDimensions/tests/UI/expected-screenshots/CustomDimensions_report_action_subtable.png +++ b/plugins/CustomDimensions/tests/UI/expected-screenshots/CustomDimensions_report_action_subtable.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:502c692ae468f9d294ae83902c8222afb4fc3f7a8d1b3dea53bca2505f21c9c4 -size 56262 +oid sha256:0fa2ab84a4583e607739de67e983a2bf4888d233575a41c3f8ce82bf12879b6c +size 53717 diff --git a/plugins/Feedback/API.php b/plugins/Feedback/API.php index 11ec8bc7f7..1619d46544 100644 --- a/plugins/Feedback/API.php +++ b/plugins/Feedback/API.php @@ -10,6 +10,8 @@ namespace Piwik\Plugins\Feedback; use Piwik\Common; use Piwik\Config; use Piwik\Container\StaticContainer; +use Piwik\DataTable\Renderer\Json; +use Piwik\Date; use Piwik\IP; use Piwik\Mail; use Piwik\Piwik; @@ -60,6 +62,64 @@ class API extends \Piwik\Plugin\API $this->sendMail($subject, $body); } + /** + * Sends feedback for a specific feature to the Matomo team or alternatively to the email address configured in the + * config: "feedback_email_address". + * + * @param $question + * @param string|bool $message A message containing the actual feedback + * @throws \Piwik\NoAccessException + * @throws \Exception + */ + public function sendFeedbackForSurvey($question, $message = false) + { + Piwik::checkUserIsNotAnonymous(); + Piwik::checkUserHasSomeViewAccess(); + + if ($message == '' || strlen($message) < 10) { + return Piwik::translate("Feedback_MessageBodyValidationError"); + } + + $featureName = $this->getEnglishTranslationForFeatureName($question); + $body = sprintf("Question: %s\n", $featureName); + $feedbackMessage = ""; + + if (!empty($message) && $message !== 'undefined') { + $feedbackMessage = sprintf("Answer:\n%s\n", trim($message)); + } + + $body .= $feedbackMessage ? $feedbackMessage : " \n"; + + $subject = sprintf("%s for %s %s", + empty($like) ? "-1" : "+1", + $featureName, + empty($feedbackMessage) ? "" : "(w/ feedback Survey)" + ); + + $this->sendMail($subject, $body); + + //if feedback is sent set next one to 6 month. + $nextReminder = Date::now()->getStartOfDay()->addMonth(6)->toString('Y-m-d'); + $feedbackReminder = new FeedbackReminder(); + $feedbackReminder->setUserOption($nextReminder); + + return 'success'; + + } + + public function updateFeedbackReminderDate() + { + Piwik::checkUserIsNotAnonymous(); + + //push reminder for 6 month + $nextReminder = Date::now()->getStartOfDay()->addMonth(6)->toString('Y-m-d'); + $feedbackReminder = new FeedbackReminder(); + $feedbackReminder->setUserOption($nextReminder); + + Json::sendHeaderJSON(); + return json_encode(['Next reminder date: ' . $nextReminder]); + } + private function sendMail($subject, $body) { $feedbackEmailAddress = Config::getInstance()->General['feedback_email_address']; diff --git a/plugins/Feedback/Controller.php b/plugins/Feedback/Controller.php index 5fa8a94023..9464f855f1 100644 --- a/plugins/Feedback/Controller.php +++ b/plugins/Feedback/Controller.php @@ -14,8 +14,6 @@ use Piwik\Piwik; use Piwik\Common; use Piwik\Version; use Piwik\Container\StaticContainer; -use Piwik\Plugins\Feedback\ReferReminder; -use Piwik\Plugins\Feedback\FeedbackReminder; use Piwik\DataTable\Renderer\Json; class Controller extends \Piwik\Plugin\Controller @@ -30,40 +28,4 @@ class Controller extends \Piwik\Plugin\Controller return $view->render(); } - /** - * Store the next date that the feedback reminder popup should be displayed to this user. - */ - public function updateFeedbackReminderDate() - { - Piwik::checkUserIsNotAnonymous(); - - $nextReminder = Common::getRequestVar('nextReminder'); - - if ($nextReminder !== Feedback::NEVER_REMIND_ME_AGAIN) { - $nextReminder = Date::now()->getStartOfDay()->addDay($nextReminder)->toString('Y-m-d'); - } - - $feedbackReminder = new FeedbackReminder(); - $feedbackReminder->setUserOption($nextReminder); - - Json::sendHeaderJSON(); - return json_encode(['Next reminder date: ' . $nextReminder]); - } - - public function updateReferReminderDate() - { - Piwik::checkUserIsNotAnonymous(); - - $nextReminder = Common::getRequestVar('nextReminder'); - - if ($nextReminder !== Feedback::NEVER_REMIND_ME_AGAIN) { - $nextReminder = Date::now()->getStartOfDay()->addDay($nextReminder)->toString('Y-m-d'); - } - - $referReminder = new ReferReminder(); - $referReminder->setUserOption($nextReminder); - - Json::sendHeaderJSON(); - return json_encode(['Next reminder date: ' . $nextReminder]); - } } diff --git a/plugins/Feedback/Feedback.php b/plugins/Feedback/Feedback.php index 8e6531b7af..55ccc67e4a 100644 --- a/plugins/Feedback/Feedback.php +++ b/plugins/Feedback/Feedback.php @@ -9,6 +9,9 @@ namespace Piwik\Plugins\Feedback; use Piwik\Date; +use Piwik\Plugins\UsersManager\API as APIUsersManager; +use Piwik\Plugins\UsersManager\UsersManager; +use Piwik\Site; use Piwik\View; use Piwik\Piwik; use Piwik\Common; @@ -39,22 +42,16 @@ class Feedback extends \Piwik\Plugin { $stylesheets[] = "plugins/Feedback/stylesheets/feedback.less"; $stylesheets[] = "plugins/Feedback/vue/src/RateFeature/RateFeature.less"; - $stylesheets[] = "plugins/Feedback/angularjs/feedback-popup/feedback-popup.directive.less"; - $stylesheets[] = "plugins/Feedback/angularjs/refer-banner/refer-banner.directive.less"; + $stylesheets[] = "plugins/Feedback/vue/src/FeedbackQuestion/FeedbackQuestion.less"; } public function getJsFiles(&$jsFiles) { - $jsFiles[] = "plugins/Feedback/angularjs/feedback-popup/feedback-popup.controller.js"; - $jsFiles[] = "plugins/Feedback/angularjs/feedback-popup/feedback-popup.directive.js"; - $jsFiles[] = "plugins/Feedback/angularjs/refer-banner/refer-banner.directive.js"; - $jsFiles[] = "plugins/Feedback/angularjs/refer-banner/refer-banner.controller.js"; } public function getClientSideTranslationKeys(&$translationKeys) { $translationKeys[] = 'Feedback_ThankYou'; - $translationKeys[] = 'Feedback_ThankYouForSpreading'; $translationKeys[] = 'Feedback_RateFeatureTitle'; $translationKeys[] = 'Feedback_RateFeatureThankYouTitle'; $translationKeys[] = 'Feedback_RateFeatureLeaveMessageLike'; @@ -65,97 +62,42 @@ class Feedback extends \Piwik\Plugin $translationKeys[] = 'Feedback_PleaseLeaveExternalReviewForMatomo'; $translationKeys[] = 'Feedback_RemindMeLater'; $translationKeys[] = 'Feedback_NeverAskMeAgain'; - $translationKeys[] = 'Feedback_ReferMatomo'; - $translationKeys[] = 'Feedback_ReferBannerTitle'; - $translationKeys[] = 'Feedback_ReferBannerLonger'; - $translationKeys[] = 'Feedback_ReferBannerSocialShareText'; - $translationKeys[] = 'Feedback_ReferBannerEmailShareSubject'; - $translationKeys[] = 'Feedback_ReferBannerEmailShareBody'; $translationKeys[] = 'Feedback_WontShowAgain'; $translationKeys[] = 'General_Ok'; $translationKeys[] = 'General_Cancel'; + $translationKeys[] = 'Feedback_Question0'; + $translationKeys[] = 'Feedback_Question1'; + $translationKeys[] = 'Feedback_Question2'; + $translationKeys[] = 'Feedback_Question3'; + $translationKeys[] = 'Feedback_Question4'; + $translationKeys[] = 'Feedback_FeedbackTitle'; + $translationKeys[] = 'Feedback_FeedbackSubtitle'; + $translationKeys[] = 'Feedback_ThankYourForFeedback'; + $translationKeys[] = 'Feedback_Policy'; + $translationKeys[] = 'Feedback_ThankYourForFeedback'; + $translationKeys[] = 'Feedback_ThankYou'; + $translationKeys[] = 'Feedback_MessageBodyValidationError'; } public function renderViewsAndAddToPage(&$pageHtml) { - $feedbackPopopView = $this->renderFeedbackPopup(); - $referBannerView = $this->renderReferBanner(); - - $views = [$feedbackPopopView, $referBannerView]; - $implodedViews = implode('', $views); - - $endOfBody = strpos($pageHtml, ''); - $pageHtml = substr_replace($pageHtml, $implodedViews, $endOfBody, 0); - } - - public function renderFeedbackPopup() - { - $popupView = new View('@Feedback/feedbackPopup'); - $popupView->promptForFeedback = (int)$this->getShouldPromptForFeedback(); - - return $popupView->render(); - } - - public function renderReferBanner() - { - $referBannerView = new View('@Feedback/referBanner'); - $referBannerView->showReferBanner = (int) $this->showReferBanner(); - - return $referBannerView->render(); - } - - public function showReferBanner() - { - if ($this->getShouldPromptForFeedback()) { - return false; - } - - if (Piwik::isUserIsAnonymous()) { - return false; - } - + //only show on superuser if (!Piwik::hasUserSuperUserAccess()) { - return false; - } - - if ($this->isDisabledInTestMode()) { - return false; + return $pageHtml; } + $feedbackQuestionBanner = $this->renderFeedbackQuestion(); - $shouldShowReferBanner = true; - - /** - * @internal - */ - Piwik::postEvent('Feedback.showReferBanner', [&$shouldShowReferBanner]); - - if (!$shouldShowReferBanner) { - return false; - } - - $referReminder = new ReferReminder(); - $nextReminderDate = $referReminder->getUserOption(); - - if ($nextReminderDate === false) { - $nextReminder = Date::now()->getStartOfDay()->addDay(135)->toString('Y-m-d'); - $referReminder->setUserOption($nextReminder); - - return false; - } - - if ($nextReminderDate === self::NEVER_REMIND_ME_AGAIN) { - return false; - } + $matches = preg_split('/()/i', $pageHtml, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE); + $pageHtml = $matches[0] . $matches[1] . $feedbackQuestionBanner . $matches[2]; + } - $pluginManager = PluginManager::getInstance(); - if ($pluginManager->hasPremiumFeatures()) { - return false; - } - $now = Date::now()->getTimestamp(); - $nextReminderDate = Date::factory($nextReminderDate); + public function renderFeedbackQuestion() + { + $feedbackQuestionBanner = new View('@Feedback/feedbackQuestionBanner'); + $feedbackQuestionBanner->showQuestionBanner = (int)$this->getShouldPromptForFeedback(); - return $nextReminderDate->getTimestamp() <= $now; + return $feedbackQuestionBanner->render(); } public function getShouldPromptForFeedback() @@ -171,22 +113,35 @@ class Feedback extends \Piwik\Plugin $feedbackReminder = new FeedbackReminder(); $nextReminderDate = $feedbackReminder->getUserOption(); + $now = Date::now()->getTimestamp(); + //user answered question if ($nextReminderDate === self::NEVER_REMIND_ME_AGAIN) { return false; } - if ($nextReminderDate === false) { - $nextReminder = Date::now()->getStartOfDay()->addDay(90)->toString('Y-m-d'); + // if is new user or old user field not exist + if ($nextReminderDate === false || $nextReminderDate <= 0) { + + // if user is created more than 6 month ago, set reminder to today and show banner + $userCreatedDate = Piwik::getCurrentUserCreationData(); + if (!empty($userCreatedDate) && Date::factory($userCreatedDate)->addMonth(6)->getTimestamp() < $now) { + $nextReminder = Date::now()->getStartOfDay()->subDay(1)->toString('Y-m-d'); + $feedbackReminder->setUserOption($nextReminder); + return true; + } + //new user extend to 6 month, don't show banner + $nextReminder = Date::now()->getStartOfDay()->addMonth(6)->toString('Y-m-d'); $feedbackReminder->setUserOption($nextReminder); - return false; } - $now = Date::now()->getTimestamp(); $nextReminderDate = Date::factory($nextReminderDate); + if ($nextReminderDate->getTimestamp() > $now) { + return false; + } + return true; - return $nextReminderDate->getTimestamp() <= $now; } // needs to be protected not private for testing purpose diff --git a/plugins/Feedback/ReferReminder.php b/plugins/Feedback/ReferReminder.php deleted file mode 100644 index b6cfa46c3b..0000000000 --- a/plugins/Feedback/ReferReminder.php +++ /dev/null @@ -1,34 +0,0 @@ -userLogin = Piwik::getCurrentUserLogin(); - $this->option = 'Feedback.nextReferReminder'; - } - - public function getUserOption() - { - return Option::get("{$this->option}.{$this->userLogin}"); - } - - public function setUserOption($value) - { - Option::set("{$this->option}.{$this->userLogin}", $value); - } -} diff --git a/plugins/Feedback/angularjs/feedback-popup/feedback-popup.controller.js b/plugins/Feedback/angularjs/feedback-popup/feedback-popup.controller.js deleted file mode 100644 index 02c669805f..0000000000 --- a/plugins/Feedback/angularjs/feedback-popup/feedback-popup.controller.js +++ /dev/null @@ -1,42 +0,0 @@ -/*! - * Matomo - free/libre analytics platform - * - * @link http://matomo.org - * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later - */ -(function () { - angular.module('piwikApp').controller('FeedbackPopupController', FeedbackPopupController); - - FeedbackPopupController.$inject = ['$scope', '$timeout', 'piwikApi']; - - function FeedbackPopupController($scope, $timeout, piwikApi) { - - var saveNextReminder = function(nextReminder) { - var ajaxHandler = new ajaxHelper(); - ajaxHandler.addParams({'module': 'Feedback', 'action': 'updateFeedbackReminderDate'}, 'GET'); - ajaxHandler.addParams({'nextReminder': nextReminder}, 'POST'); - ajaxHandler.send(); - }; - - var remindMeLater = function() { - saveNextReminder(90); - }; - - var dontShowAgain = function() { - saveNextReminder(-1); - }; - - var init = function() { - if ($scope.promptForFeedback === 1) { - $timeout(function() { - $scope.feedbackPopup.dialog = {}; - $scope.feedbackPopup.dialog.show = true; - $scope.feedbackPopup.remindMeLater = remindMeLater; - $scope.feedbackPopup.dontShowAgain = dontShowAgain; - }); - } - }; - - init(); - } -})(); \ No newline at end of file diff --git a/plugins/Feedback/angularjs/feedback-popup/feedback-popup.directive.html b/plugins/Feedback/angularjs/feedback-popup/feedback-popup.directive.html deleted file mode 100644 index ef48a83efe..0000000000 --- a/plugins/Feedback/angularjs/feedback-popup/feedback-popup.directive.html +++ /dev/null @@ -1,20 +0,0 @@ -
-
- -
-

{{'Feedback_ReviewMatomoTitle'|translate }}

-
- -
- - -
-
\ No newline at end of file diff --git a/plugins/Feedback/angularjs/feedback-popup/feedback-popup.directive.js b/plugins/Feedback/angularjs/feedback-popup/feedback-popup.directive.js deleted file mode 100644 index 4614c88dc8..0000000000 --- a/plugins/Feedback/angularjs/feedback-popup/feedback-popup.directive.js +++ /dev/null @@ -1,38 +0,0 @@ -/*! - * Matomo - free/libre analytics platform - * - * @link http://matomo.org - * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later - */ - -/** - * Usage: - *
- */ -(function () { - angular.module('piwikApp').directive('piwikFeedbackPopup', piwikFeedbackPopup); - - piwikFeedbackPopup.$inject = ['piwik']; - - function piwikFeedbackPopup(piwik){ - var defaults = { - }; - - return { - restrict: 'A', - scope: { - promptForFeedback: '<' - }, - templateUrl: 'plugins/Feedback/angularjs/feedback-popup/feedback-popup.directive.html?cb=' + piwik.cacheBuster, - controller: 'FeedbackPopupController', - controllerAs: 'feedbackPopup', - compile: function (element, attrs) { - for (var index in defaults) { - if (defaults.hasOwnProperty(index) && attrs[index] === undefined) { - attrs[index] = defaults[index]; - } - } - } - }; - } -})(); \ No newline at end of file diff --git a/plugins/Feedback/angularjs/feedback-popup/feedback-popup.directive.less b/plugins/Feedback/angularjs/feedback-popup/feedback-popup.directive.less deleted file mode 100644 index 25aa00154c..0000000000 --- a/plugins/Feedback/angularjs/feedback-popup/feedback-popup.directive.less +++ /dev/null @@ -1,25 +0,0 @@ -.requestReview { - .review-links { - display: flex; - } - - .review-link { - width: 20%; - - div { - width: 100%; - } - - div.image { - height: 80px; - } - - div.link { - font-size: 13px; - } - - img { - max-width: 60px; - } - } -} diff --git a/plugins/Feedback/angularjs/feedback-popup/review-links.directive.html b/plugins/Feedback/angularjs/feedback-popup/review-links.directive.html deleted file mode 100644 index 5da2f819a9..0000000000 --- a/plugins/Feedback/angularjs/feedback-popup/review-links.directive.html +++ /dev/null @@ -1,40 +0,0 @@ -
-

{{ 'Feedback_PleaseLeaveExternalReviewForMatomo'|translate }}



- - -
diff --git a/plugins/Feedback/angularjs/refer-banner/refer-banner.controller.js b/plugins/Feedback/angularjs/refer-banner/refer-banner.controller.js deleted file mode 100644 index 9babbe281e..0000000000 --- a/plugins/Feedback/angularjs/refer-banner/refer-banner.controller.js +++ /dev/null @@ -1,110 +0,0 @@ -/*! - * Matomo - free/libre analytics platform - * - * @link http://matomo.org - * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later - */ -(function () { - angular.module('piwikApp').controller('ReferBannerController', ReferBannerController); - - ReferBannerController.$inject = ['$scope', '$timeout']; - - function ReferBannerController($scope, $timeout) { - var setNextReminder = function(nextReminder) { - var ajaxHandler = new ajaxHelper(); - ajaxHandler.addParams({'module': 'Feedback', 'action': 'updateReferReminderDate'}, 'GET'); - ajaxHandler.addParams({'nextReminder': nextReminder}, 'POST'); - ajaxHandler.send(); - }; - - var remindMeLater = function() { - $scope.referBanner.show = false; - - setNextReminder(6 * 30); - }; - - var dontShowAgain = function() { - $scope.referBanner.show = false; - - setNextReminder(-1); - }; - - var share = function() { - var modal = M.Modal.getInstance($('.modal.open')); - - if (modal) { - modal.close(); - } - - $scope.referBanner.showThanks = true; - $scope.referBanner.show = false; - - setNextReminder(-1); - } - - $scope.socialUrl = function (type) { - var text = _pk_translate('Feedback_ReferBannerSocialShareText'); - var url = 'https://matomo.org/?pk_campaign=share&pk_kwd=onpremise'; - - if (type === 'twitter') { - var base = 'https://twitter.com/intent/tweet?'; - - var params = { 'text': text, 'url': url}; - var paramString = ''; - for (var param in params) { - paramString += param + '=' + encodeURIComponent(params[param]) + '&'; - } - - return base + paramString.slice(0, -1); - } - - if (type === 'facebook') { - var base = 'https://www.facebook.com/sharer.php?'; - - var params = { 't': text, 'u': url}; - var paramString = ''; - for (var param in params) { - paramString += param + '=' + encodeURIComponent(params[param]) + '&'; - } - - return base + paramString.slice(0, -1); - } - - if (type === 'linkedin') { - var base = 'https://www.linkedin.com/sharing/share-offsite/?'; - - var params = { 'url': url }; - var paramString = ''; - for (var param in params) { - paramString += param + '=' + encodeURIComponent(params[param]) + '&'; - } - - return base + paramString.slice(0, -1); - } - - return '#'; - }; - - $scope.referEmail = function () { - var subject = _pk_translate('Feedback_ReferBannerEmailShareSubject'); - var body = _pk_translate('Feedback_ReferBannerEmailShareBody'); - - return encodeURI('mailto:YOUR_FRIEND@EMAIL.ADDRESS?subject=' + subject + '&body=' + body); - } - - var init = function() { - $scope.referBanner.showThanks = false; - $scope.referBanner.remindMeLater = remindMeLater; - $scope.referBanner.dontShowAgain = dontShowAgain; - $scope.referBanner.share = share; - - if ($scope.showReferBanner === 1) { - $timeout(function() { - $scope.referBanner.show = true; - }); - } - }; - - init(); - } -})(); diff --git a/plugins/Feedback/angularjs/refer-banner/refer-banner.directive.html b/plugins/Feedback/angularjs/refer-banner/refer-banner.directive.html deleted file mode 100644 index 34bbd87d0b..0000000000 --- a/plugins/Feedback/angularjs/refer-banner/refer-banner.directive.html +++ /dev/null @@ -1,44 +0,0 @@ -
-
- -
-

{{'Feedback_ReferBannerTitle'|translate }}

-
- -
-

{{'Feedback_ReferBannerLonger'|translate }}

- - -
- - -
- -
-

{{ 'Feedback_ThankYouForSpreading'|translate }}

-

{{ 'Feedback_WontShowAgain'|translate }}

- - -
-
diff --git a/plugins/Feedback/angularjs/refer-banner/refer-banner.directive.js b/plugins/Feedback/angularjs/refer-banner/refer-banner.directive.js deleted file mode 100644 index 4c14a49e3f..0000000000 --- a/plugins/Feedback/angularjs/refer-banner/refer-banner.directive.js +++ /dev/null @@ -1,28 +0,0 @@ -/*! - * Matomo - free/libre analytics platform - * - * @link http://matomo.org - * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later - */ - -/** - * Usage: - *
- */ -(function () { - angular.module('piwikApp').directive('piwikReferBanner', piwikReferBanner); - - piwikReferBanner.$inject = ['piwik']; - - function piwikReferBanner(piwik){ - return { - restrict: 'A', - scope: { - showReferBanner: '<' - }, - templateUrl: 'plugins/Feedback/angularjs/refer-banner/refer-banner.directive.html?cb=' + piwik.cacheBuster, - controller: 'ReferBannerController', - controllerAs: 'referBanner', - }; - } -})(); \ No newline at end of file diff --git a/plugins/Feedback/angularjs/refer-banner/refer-banner.directive.less b/plugins/Feedback/angularjs/refer-banner/refer-banner.directive.less deleted file mode 100644 index 543918a97e..0000000000 --- a/plugins/Feedback/angularjs/refer-banner/refer-banner.directive.less +++ /dev/null @@ -1,48 +0,0 @@ -.flex { - display: flex; -} - -.flex-grow { - flex-grow: 1; -} - -.flex-none { - flex: none; -} - -.items-center { - align-items: center; -} - -.justify-center { - justify-content: center; -} - -.justify-around { - justify-content: space-around; -} - -.text-center { - text-align: center; -} - -.h-full { - height: 100%; -} - -.text-twitter-blue { - color: #00aced; -} - -.text-fb-blue { - color: #3b5998; -} - -.text-li-blue { - color: #007bb6; -} - -.refer-banner .share-button { - width:60px; - margin-top:24px; -} diff --git a/plugins/Feedback/images/facebook_logo.svg b/plugins/Feedback/images/facebook_logo.svg deleted file mode 100644 index 54a49626e0..0000000000 --- a/plugins/Feedback/images/facebook_logo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/plugins/Feedback/images/linkedin_logo.svg b/plugins/Feedback/images/linkedin_logo.svg deleted file mode 100644 index 6a5826451d..0000000000 --- a/plugins/Feedback/images/linkedin_logo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/plugins/Feedback/images/mastodon_logo.svg b/plugins/Feedback/images/mastodon_logo.svg deleted file mode 100644 index e19e492758..0000000000 --- a/plugins/Feedback/images/mastodon_logo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/plugins/Feedback/images/twitter_logo.svg b/plugins/Feedback/images/twitter_logo.svg deleted file mode 100644 index 49a98867fa..0000000000 --- a/plugins/Feedback/images/twitter_logo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/plugins/Feedback/lang/en.json b/plugins/Feedback/lang/en.json index 887ab1555c..345be23916 100644 --- a/plugins/Feedback/lang/en.json +++ b/plugins/Feedback/lang/en.json @@ -14,7 +14,6 @@ "RateFeatureTitle": "Do you like the '%s' feature? Please rate and leave a comment", "SendFeedback": "Send Feedback", "ThankYou": "Thank you for helping us to make Matomo better!", - "ThankYouForSpreading": "Thank you for spreading the word and creating a safer web", "TopLinkTooltip": "Tell us what you think, or request Professional Support.", "ViewAnswersToFAQ": "View answers to %1$sFrequently Asked Questions%2$s", "FAQs": "FAQs", @@ -43,12 +42,16 @@ "PurgeOldData": "I want to remove some old data", "SearchHelpResources": "Search matomo.org help resources", "PopularHelpTopics": "Popular help topics", - "ReferMatomo": "Refer Matomo", - "ReferBannerTitle": "Believe in Matomo?", - "ReferBannerLonger": "Please help us spread the word about us so more people get control over their analytics data.", - "ReferBannerEmailShareSubject": "Refer them to Matomo Analytics now to take back control!", - "ReferBannerEmailShareBody": "I choose Matomo, an ethical alternative to Google Analytics that gives me 100%% data ownership and protects the data of my website visitors.\r\nI’m sharing this message in the hope that you too will take back the power from Google and get complete ownership of your own data.\r\n\r\nCheck out Matomo at https://matomo.org", - "ReferBannerSocialShareText": "If you’re using Google Analytics, stay in control by switching to an ethical alternative like Matomo now!", - "WontShowAgain": "We won't show this message again." + "WontShowAgain": "We won't show this message again.", + "Question0": "What are your biggest problems or pain points with Matomo and why?", + "Question1": "What is the one thing you’d like to see improved in Matomo and why?", + "Question2": "What is the feature you are missing the most in Matomo and why?", + "Question3": "What is your main goal for using Matomo?", + "Question4": "What is your main concern about Matomo?", + "FeedbackTitle": "Please help us improve Matomo", + "FeedbackSubtitle": "Here's your chance to ask for it! Please describe in as much details as you can.
Your feedback will help us improve Matomo. %1$s", + "ThankYourForFeedback": "We really appreciate your feedback! %1$s We will be in touch in case we require more information about your feedback.", + "Policy": "Your message and your email address will be sent to us by submitting this form. The information will be only used to improve our products and services. Your data will be processed by us, our hosting provider, and our support ticket provider. For more information have a look at %1$sMatomo's Privacy Policy%2$s.", + "MessageBodyValidationError": "The message body is too short (minimum is 10 characters)." } } \ No newline at end of file diff --git a/plugins/Feedback/templates/feedbackPopup.twig b/plugins/Feedback/templates/feedbackPopup.twig deleted file mode 100644 index 7315d4ad12..0000000000 --- a/plugins/Feedback/templates/feedbackPopup.twig +++ /dev/null @@ -1 +0,0 @@ -
diff --git a/plugins/Feedback/templates/feedbackQuestionBanner.twig b/plugins/Feedback/templates/feedbackQuestionBanner.twig new file mode 100644 index 0000000000..5daa2548ae --- /dev/null +++ b/plugins/Feedback/templates/feedbackQuestionBanner.twig @@ -0,0 +1 @@ +
\ No newline at end of file diff --git a/plugins/Feedback/templates/index.twig b/plugins/Feedback/templates/index.twig index c14603f52e..73c149650f 100644 --- a/plugins/Feedback/templates/index.twig +++ b/plugins/Feedback/templates/index.twig @@ -94,10 +94,6 @@ )|raw }}

-
-
-
-