From f16a186fafff055f2e686abb6070d002a185ca82 Mon Sep 17 00:00:00 2001 From: James Cole Date: Sun, 23 Jul 2017 07:30:05 +0200 Subject: [PATCH] Option to re-enable intro boxes. --- app/Helpers/Help/Help.php | 10 ++- app/Http/Controllers/HelpController.php | 79 +++++++++++++------ app/Http/Controllers/Json/IntroController.php | 21 ++++- public/js/ff/help.js | 23 ++++-- resources/lang/en_US/firefly.php | 2 + resources/views/layout/default.twig | 7 +- routes/web.php | 1 + 7 files changed, 107 insertions(+), 36 deletions(-) diff --git a/app/Helpers/Help/Help.php b/app/Helpers/Help/Help.php index c7c97bcb96..584e8d5a73 100644 --- a/app/Helpers/Help/Help.php +++ b/app/Helpers/Help/Help.php @@ -30,6 +30,8 @@ class Help implements HelpInterface /** @var string */ protected $userAgent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36'; + const CACHEKEY = 'help_%s_%s'; + /** * @param string $route * @param string $language @@ -38,7 +40,7 @@ class Help implements HelpInterface */ public function getFromCache(string $route, string $language): string { - $line = sprintf('help.%s.%s', $route, $language); + $line = sprintf(self::CACHEKEY, $route, $language); return Cache::get($line); } @@ -64,12 +66,12 @@ class Help implements HelpInterface return ''; } - Log::debug(sprintf('Status code is %d', $result->status_code)); if ($result->status_code === 200) { $content = trim($result->body); } + if (strlen($content) > 0) { Log::debug('Content is longer than zero. Expect something.'); $converter = new CommonMarkConverter(); @@ -98,7 +100,7 @@ class Help implements HelpInterface */ public function inCache(string $route, string $language): bool { - $line = sprintf('help.%s.%s', $route, $language); + $line = sprintf(self::CACHEKEY, $route, $language); $result = Cache::has($line); if ($result) { Log::debug(sprintf('Cache has this entry: %s', 'help.' . $route . '.' . $language)); @@ -120,7 +122,7 @@ class Help implements HelpInterface */ public function putInCache(string $route, string $language, string $content) { - $key = sprintf('help.%s.%s', $route, $language); + $key = sprintf(self::CACHEKEY, $route, $language); if (strlen($content) > 0) { Log::debug(sprintf('Will store entry in cache: %s', $key)); Cache::put($key, $content, 10080); // a week. diff --git a/app/Http/Controllers/HelpController.php b/app/Http/Controllers/HelpController.php index e776749bc6..260b214b8f 100644 --- a/app/Http/Controllers/HelpController.php +++ b/app/Http/Controllers/HelpController.php @@ -25,62 +25,95 @@ use Response; */ class HelpController extends Controller { + + /** @var HelpInterface */ + private $help; + /** * HelpController constructor. */ public function __construct() { parent::__construct(); + + $this->middleware( + function ($request, $next) { + $this->help = app(HelpInterface::class); + + return $next($request); + } + ); } /** - * @param HelpInterface $help * @param $route * * @return \Illuminate\Http\JsonResponse */ - public function show(HelpInterface $help, string $route) + public function show(string $route) { - $language = Preferences::get('language', config('firefly.default_language', 'en_US'))->data; - $content = '

' . strval(trans('firefly.route_has_no_help')) . '

'; + $html = $this->getHelpText($route, $language); - if (!$help->hasRoute($route)) { + return Response::json(['html' => $html]); + + } + + /** + * @param string $route + * @param string $language + * + * @return string + */ + private function getHelpText(string $route, string $language): string + { + // get language and default variables. + + $content = '

' . strval(trans('firefly.route_has_no_help')) . '

'; + + // if no such route, log error and return default text. + if (!$this->help->hasRoute($route)) { Log::error('No such route: ' . $route); - return Response::json($content); + return $content; } - if ($help->inCache($route, $language)) { - $content = $help->getFromCache($route, $language); + // help content may be cached: + if ($this->help->inCache($route, $language)) { + $content = $this->help->getFromCache($route, $language); Log::debug(sprintf('Help text %s was in cache.', $language)); - return Response::json($content); + return $content; } - $content = $help->getFromGithub($route, $language); - $notYourLanguage = '

' . strval(trans('firefly.help_may_not_be_your_language')) . '

'; + // get help content from Github: + $content = $this->help->getFromGithub($route, $language); - // get backup language content (try English): + // content will have 0 length when Github failed. Try en_US when it does: if (strlen($content) === 0) { $language = 'en_US'; - if ($help->inCache($route, $language)) { + + // also check cache first: + if ($this->help->inCache($route, $language)) { Log::debug(sprintf('Help text %s was in cache.', $language)); - $content = $notYourLanguage . $help->getFromCache($route, $language); - } - if (!$help->inCache($route, $language)) { - $content = trim($notYourLanguage . $help->getFromGithub($route, $language)); + $content = $this->help->getFromCache($route, $language); + + return $content; } + + $content = $this->help->getFromGithub($route, $language); + } - if ($content === $notYourLanguage) { - $content = '

' . strval(trans('firefly.route_has_no_help')) . '

'; + // help still empty? + if (strlen($content) !== 0) { + $this->help->putInCache($route, $language, $content); + + return $content; + } - $help->putInCache($route, $language, $content); - - return Response::json($content); - + return '

' . strval(trans('firefly.route_has_no_help')) . '

'; } diff --git a/app/Http/Controllers/Json/IntroController.php b/app/Http/Controllers/Json/IntroController.php index 7361e8d535..25fd4617a8 100644 --- a/app/Http/Controllers/Json/IntroController.php +++ b/app/Http/Controllers/Json/IntroController.php @@ -69,6 +69,23 @@ class IntroController return in_array('outro', $keys); } + /** + * @param string $route + * @param string $specialPage + * + * @return \Illuminate\Http\JsonResponse + */ + public function postEnable(string $route, string $specialPage = '') + { + $key = 'shown_demo_' . $route; + if ($specialPage !== '') { + $key .= '_' . $specialPage; + } + Log::debug(sprintf('Going to mark the following route as NOT done: %s with special "%s" (%s)', $route, $specialPage, $key)); + Preferences::set($key, false); + + return Response::json(['message' => trans('firefly.intro_boxes_after_refresh')]); + } /** * @param string $route @@ -82,8 +99,8 @@ class IntroController if ($specialPage !== '') { $key .= '_' . $specialPage; } - Log::debug(sprintf('Going to mark the following route as doen: %s with special "%s" (%s)', $route, $specialPage, $key)); - //Preferences::set($key, true); + Log::debug(sprintf('Going to mark the following route as done: %s with special "%s" (%s)', $route, $specialPage, $key)); + Preferences::set($key, true); return Response::json(['result' => sprintf('Reported demo watched for route "%s".', $route)]); } diff --git a/public/js/ff/help.js b/public/js/ff/help.js index 536a4c5c2e..2bb4b9e530 100644 --- a/public/js/ff/help.js +++ b/public/js/ff/help.js @@ -11,27 +11,40 @@ $(function () { "use strict"; $('#help').click(showHelp); - $(function () { - //$('[data-toggle="tooltip"]').tooltip(); - }); }); function showHelp(e) { "use strict"; var target = $(e.target); var route = target.data('route'); - // + var specialPage = target.data('extra'); + + if (typeof specialPage === 'undefined') { + specialPage = ''; + } $('#helpBody').html(''); $('#helpTitle').html('Please hold...'); $('#helpModal').modal('show'); $('#helpTitle').html('Help for this page'); $.getJSON('help/' + encodeURI(route)).done(function (data) { - $('#helpBody').html(data); + $('#helpBody').html(data.html); }).fail(function () { $('#helpBody').html('

No help text could be found.

'); $('#helpTitle').html('Apologies'); }); + $('#reenableGuidance').unbind('click').click(function () { + enableGuidance(route, specialPage); + }); return false; } + +function enableGuidance(route, specialPage) { + $.post('json/intro/enable/' + route + '/' + specialPage).done(function (data) { + alert(data.message); + }).fail(function () { + alert('Could not re-enable introduction.'); + }) +} + diff --git a/resources/lang/en_US/firefly.php b/resources/lang/en_US/firefly.php index 16809cac19..6bfba0b0c9 100644 --- a/resources/lang/en_US/firefly.php +++ b/resources/lang/en_US/firefly.php @@ -80,6 +80,8 @@ return [ 'user_id_is' => 'Your user id is :user', 'field_supports_markdown' => 'This field supports Markdown.', 'need_more_help' => 'If you need more help using Firefly III, please open a ticket on Github.', + 'reenable_intro_text' => 'You can also reenable the introduction guidance.', + 'intro_boxes_after_refresh' => 'The introduction boxes will reappear when you refresh the page.', 'nothing_to_display' => 'There are no transactions to show you', 'show_all_no_filter' => 'Show all transactions without grouping them by date.', 'expenses_by_category' => 'Expenses by category', diff --git a/resources/views/layout/default.twig b/resources/views/layout/default.twig index 887a4a9442..334c77441f 100644 --- a/resources/views/layout/default.twig +++ b/resources/views/layout/default.twig @@ -46,7 +46,7 @@
- + {# Logo #}