'getStylesheetFiles', 'AssetManager.getJavaScriptFiles' => 'getJsFiles', 'Translate.getClientSideTranslationKeys' => 'getClientSideTranslationKeys', 'Controller.CoreHome.index.end' => 'renderViewsAndAddToPage' ); } public function getStylesheetFiles(&$stylesheets) { $stylesheets[] = "plugins/Feedback/stylesheets/feedback.less"; $stylesheets[] = "plugins/Feedback/vue/src/RateFeature/RateFeature.less"; $stylesheets[] = "plugins/Feedback/vue/src/ReviewLinks/ReviewLinks.less"; $stylesheets[] = "plugins/Feedback/vue/src/FeedbackQuestion/FeedbackQuestion.less"; } public function getJsFiles(&$jsFiles) { } public function getClientSideTranslationKeys(&$translationKeys) { $translationKeys[] = 'Feedback_ThankYouHeart'; $translationKeys[] = 'Feedback_ThankYouForSpreading'; $translationKeys[] = 'Feedback_RateFeatureTitle'; $translationKeys[] = 'Feedback_RateFeatureThankYouTitle'; $translationKeys[] = 'Feedback_RateFeatureLeaveMessageLike'; $translationKeys[] = 'Feedback_RateFeatureLeaveMessageLikeNamedFeature'; $translationKeys[] = 'Feedback_RateFeatureLeaveMessageLikeExtra'; $translationKeys[] = 'Feedback_RateFeatureLeaveMessageLikeExtraConfigurable'; $translationKeys[] = 'Feedback_RateFeatureLeaveMessageLikeExtraEasy'; $translationKeys[] = 'Feedback_RateFeatureLeaveMessageLikeExtraUseful'; $translationKeys[] = 'Feedback_RateFeatureLeaveMessageDislike'; $translationKeys[] = 'Feedback_RateFeatureLeaveMessageDislikeNamedFeature'; $translationKeys[] = 'Feedback_RateFeatureLeaveMessageDislikeExtra'; $translationKeys[] = 'Feedback_RateFeatureLeaveMessageDislikeExtraBugs'; $translationKeys[] = 'Feedback_RateFeatureLeaveMessageDislikeExtraMissing'; $translationKeys[] = 'Feedback_RateFeatureLeaveMessageDislikeExtraSpeed'; $translationKeys[] = 'Feedback_RateFeatureLeaveMessageDislikeExtraEasier'; $translationKeys[] = 'Feedback_RateFeatureOtherReason'; $translationKeys[] = 'Feedback_SendFeedback'; $translationKeys[] = 'Feedback_RateFeatureSendFeedbackInformation'; $translationKeys[] = 'Feedback_RateFeatureUsefulInfo'; $translationKeys[] = 'Feedback_RateFeatureEasyToUse'; $translationKeys[] = 'Feedback_RateFeatureConfigurable'; $translationKeys[] = 'Feedback_RateFeatureDislikeAddMissingFeatures'; $translationKeys[] = 'Feedback_RateFeatureDislikeMakeEasier'; $translationKeys[] = 'Feedback_RateFeatureDislikeSpeedUp'; $translationKeys[] = 'Feedback_RateFeatureDislikeFixBugs'; $translationKeys[] = 'Feedback_ReviewMatomoTitle'; $translationKeys[] = 'Feedback_PleaseLeaveExternalReviewForMatomo'; $translationKeys[] = 'Feedback_RemindMeLater'; $translationKeys[] = 'Feedback_NeverAskMeAgain'; $translationKeys[] = 'Feedback_WontShowAgain'; $translationKeys[] = 'Feedback_AppreciateFeedback'; $translationKeys[] = 'Feedback_Policy'; $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_Policy'; $translationKeys[] = 'Feedback_ThankYourForFeedback'; $translationKeys[] = 'Feedback_ThankYou'; $translationKeys[] = 'Feedback_MessageBodyValidationError'; } public function renderViewsAndAddToPage(&$pageHtml) { //only show on superuser if (!Piwik::hasUserSuperUserAccess()) { return $pageHtml; } $feedbackQuestionBanner = $this->renderFeedbackQuestion(); $matches = preg_split('/()/i', $pageHtml, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE); $pageHtml = $matches[0] . $matches[1] . $feedbackQuestionBanner . $matches[2]; } public function renderFeedbackQuestion() { $feedbackQuestionBanner = new View('@Feedback/feedbackQuestionBanner'); $feedbackQuestionBanner->showQuestionBanner = (int)$this->showQuestionBanner(); return $feedbackQuestionBanner->render(); } public function showQuestionBanner() { if (Piwik::isUserIsAnonymous()) { return false; } // Hide Feedback popup in all tests except if forced if ($this->isDisabledInTestMode()) { return false; } $shouldShowQuestionBanner = true; Piwik::postEvent('Feedback.showQuestionBanner', [&$shouldShowQuestionBanner]); if (!$shouldShowQuestionBanner) { return false; } $feedbackReminder = new FeedbackReminder(); $nextReminderDate = $feedbackReminder->getUserOption(); $now = Date::now()->getTimestamp(); // If there isn't any reminder date set, or never remind me was selected previously (-1) we determine a new date if ($nextReminderDate === false || $nextReminderDate <= 0) { // if user was created within the last 6 months, we set the date to 6 months after his creation date $userCreatedDate = Piwik::getCurrentUserCreationDate(); if (!empty($userCreatedDate) && Date::factory($userCreatedDate)->addMonth(6)->getTimestamp() > $now) { $nextReminder = Date::factory($userCreatedDate)->addMonth(6)->toString('Y-m-d'); $feedbackReminder->setUserOption($nextReminder); return false; } // Otherwise we set the date to somewhen within the next 6 months $nextReminder = Date::now()->getStartOfDay()->addDay(Common::getRandomInt(1, 6*30))->toString('Y-m-d'); $feedbackReminder->setUserOption($nextReminder); return false; } $nextReminderDate = Date::factory($nextReminderDate); if ($nextReminderDate->getTimestamp() > $now) { return false; } return true; } // needs to be protected not private for testing purpose protected function isDisabledInTestMode() { return defined('PIWIK_TEST_MODE') && PIWIK_TEST_MODE && !Common::getRequestVar('forceFeedbackTest', false); } }