diff --git a/app/Console/Commands/UpgradeDatabaseEncoding.php b/app/Console/Commands/UpgradeDatabaseEncoding.php new file mode 100644 index 000000000..a17fc9523 --- /dev/null +++ b/app/Console/Commands/UpgradeDatabaseEncoding.php @@ -0,0 +1,57 @@ +option('database') !== null) { + DB::setDefaultConnection($this->option('database')); + } + + $database = DB::getDatabaseName(); + $tables = DB::select('SHOW TABLES'); + $this->line('ALTER DATABASE `'.$database.'` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;'); + $this->line('USE `'.$database.'`;'); + $key = 'Tables_in_' . $database; + foreach ($tables as $table) { + $tableName = $table->$key; + $this->line('ALTER TABLE `'.$tableName.'` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;'); + } + + DB::setDefaultConnection($connection); + } +} diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index 4fa0b3c80..af9f5fd46 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -15,7 +15,8 @@ class Kernel extends ConsoleKernel Commands\ClearActivity::class, Commands\ClearRevisions::class, Commands\RegeneratePermissions::class, - Commands\RegenerateSearch::class + Commands\RegenerateSearch::class, + Commands\UpgradeDatabaseEncoding::class ]; /** diff --git a/app/Repos/EntityRepo.php b/app/Repos/EntityRepo.php index 7bc5fc4fc..7865de772 100644 --- a/app/Repos/EntityRepo.php +++ b/app/Repos/EntityRepo.php @@ -571,7 +571,7 @@ class EntityRepo $draftPage->slug = $this->findSuitableSlug('page', $draftPage->name, false, $draftPage->book->id); $draftPage->html = $this->formatHtml($input['html']); - $draftPage->text = strip_tags($draftPage->html); + $draftPage->text = $this->pageToPlainText($draftPage->html); $draftPage->draft = false; $draftPage->revision_count = 1; @@ -713,6 +713,17 @@ class EntityRepo return $content; } + /** + * Get the plain text version of a page's content. + * @param Page $page + * @return string + */ + public function pageToPlainText(Page $page) + { + $html = $this->renderPage($page); + return strip_tags($html); + } + /** * Get a new draft page instance. * @param Book $book @@ -816,7 +827,7 @@ class EntityRepo $userId = user()->id; $page->fill($input); $page->html = $this->formatHtml($input['html']); - $page->text = strip_tags($page->html); + $page->text = $this->pageToPlainText($page); if (setting('app-editor') !== 'markdown') $page->markdown = ''; $page->updated_by = $userId; $page->revision_count++; @@ -933,7 +944,7 @@ class EntityRepo $revision = $page->revisions()->where('id', '=', $revisionId)->first(); $page->fill($revision->toArray()); $page->slug = $this->findSuitableSlug('page', $page->name, $page->id, $book->id); - $page->text = strip_tags($page->html); + $page->text = $this->pageToPlainText($page->html); $page->updated_by = user()->id; $page->save(); $this->searchService->indexEntity($page); @@ -953,7 +964,7 @@ class EntityRepo if ($page->draft) { $page->fill($data); if (isset($data['html'])) { - $page->text = strip_tags($data['html']); + $page->text = $this->pageToPlainText($data['html']); } $page->save(); return $page; diff --git a/database/migrations/2017_07_02_152834_update_db_encoding_to_ut8mb4.php b/database/migrations/2017_07_02_152834_update_db_encoding_to_ut8mb4.php index 550c95826..5681013ad 100644 --- a/database/migrations/2017_07_02_152834_update_db_encoding_to_ut8mb4.php +++ b/database/migrations/2017_07_02_152834_update_db_encoding_to_ut8mb4.php @@ -1,7 +1,5 @@ setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false); - $pdo->exec('ALTER DATABASE `'.$database.'` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci'); - $key = 'Tables_in_' . $database; - foreach ($tables as $table) { - $tableName = $table->$key; - $pdo->exec('ALTER TABLE `'.$tableName.'` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci'); - } + // Migration removed due to issues during live migration. + // Instead you can run the command `artisan bookstack:db-utf8mb4` + // which will generate out the SQL request to upgrade your DB to utf8mb4. } /** @@ -32,15 +23,6 @@ class UpdateDbEncodingToUt8mb4 extends Migration */ public function down() { - $database = DB::getDatabaseName(); - $tables = DB::select('SHOW TABLES'); - $pdo = DB::getPdo(); - $pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false); - $pdo->exec('ALTER DATABASE `'.$database.'` CHARACTER SET utf8 COLLATE utf8_unicode_ci'); - $key = 'Tables_in_' . $database; - foreach ($tables as $table) { - $tableName = $table->$key; - $pdo->exec('ALTER TABLE `'.$tableName.'` CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci'); - } + // } } diff --git a/resources/assets/js/controllers.js b/resources/assets/js/controllers.js index ac1c3487c..9337ea889 100644 --- a/resources/assets/js/controllers.js +++ b/resources/assets/js/controllers.js @@ -379,7 +379,7 @@ module.exports = function (ngApp, events) { */ $scope.discardDraft = function () { let url = window.baseUrl('/ajax/page/' + pageId); - $http.get(url).then((responseData) => { + $http.get(url).then(responseData => { if (autoSave) $interval.cancel(autoSave); $scope.draftText = trans('entities.pages_editing_page'); $scope.isUpdateDraft = false; diff --git a/resources/assets/js/directives.js b/resources/assets/js/directives.js index 51f1b7579..d783fd682 100644 --- a/resources/assets/js/directives.js +++ b/resources/assets/js/directives.js @@ -123,25 +123,31 @@ module.exports = function (ngApp, events) { restrict: 'A', link: function (scope, element, attrs) { const menu = element.find('ul'); - element.find('[dropdown-toggle]').on('click', function () { + + function hide() { + menu.hide(); + menu.removeClass('anim menuIn'); + } + + function show() { menu.show().addClass('anim menuIn'); + element.mouseleave(hide); + + // Focus on input if exist in dropdown and hide on enter press let inputs = menu.find('input'); - let hasInput = inputs.length > 0; - if (hasInput) { - inputs.first().focus(); - element.on('keypress', 'input', event => { - if (event.keyCode === 13) { - event.preventDefault(); - menu.hide(); - menu.removeClass('anim menuIn'); - return false; - } - }); - } - element.mouseleave(function () { - menu.hide(); - menu.removeClass('anim menuIn'); - }); + if (inputs.length > 0) inputs.first().focus(); + } + + // Hide menu on option click + element.on('click', '> ul a', hide); + // Show dropdown on toggle click. + element.find('[dropdown-toggle]').on('click', show); + // Hide menu on enter press in inputs + element.on('keypress', 'input', event => { + if (event.keyCode !== 13) return true; + event.preventDefault(); + hide(); + return false; }); } }; diff --git a/resources/assets/sass/_header.scss b/resources/assets/sass/_header.scss index 16ed75545..ae8dd3ff5 100644 --- a/resources/assets/sass/_header.scss +++ b/resources/assets/sass/_header.scss @@ -142,7 +142,6 @@ form.search-box { color: #aaa; padding: 0 $-xs; } - .faded { a, button, span, span > div { color: #666; @@ -178,6 +177,8 @@ form.search-box { padding-left: 0; } } + + .action-buttons .dropdown-container:last-child a { padding-right: 0; padding-left: $-s; @@ -196,6 +197,25 @@ form.search-box { } } +@include smaller-than($m) { + .breadcrumbs .text-button, .action-buttons .text-button { + padding: $-s $-xs; + } + .action-buttons .dropdown-container:last-child a { + padding-left: $-xs; + } + .breadcrumbs .text-button { + font-size: 0; + } + .breadcrumbs a i { + font-size: $fs-m; + padding-right: 0; + } + .breadcrumbs span.sep { + padding: 0 $-xxs; + } +} + .nav-tabs { text-align: center; a, .tab-item { diff --git a/resources/assets/sass/_text.scss b/resources/assets/sass/_text.scss index ccef2a70f..2ef4bd16d 100644 --- a/resources/assets/sass/_text.scss +++ b/resources/assets/sass/_text.scss @@ -152,6 +152,14 @@ pre { } } +@media print { + pre { + padding-left: 12px; + } + pre:after { + display: none; + } +} blockquote { display: block; diff --git a/resources/views/books/show.blade.php b/resources/views/books/show.blade.php index ddbe7a0a4..0e3bd4e17 100644 --- a/resources/views/books/show.blade.php +++ b/resources/views/books/show.blade.php @@ -5,10 +5,10 @@
-
+
@include('books._breadcrumbs', ['book' => $book])
-
+
{{ trans('entities.export') }}
@@ -50,7 +50,7 @@
-
+
@@ -112,7 +112,7 @@ @endif