diff --git a/app/Entities/Repos/PageRepo.php b/app/Entities/Repos/PageRepo.php index 1aeee8dae..208aa5fa3 100644 --- a/app/Entities/Repos/PageRepo.php +++ b/app/Entities/Repos/PageRepo.php @@ -422,25 +422,29 @@ class PageRepo extends EntityRepo return []; } - $tree = collect([]); - foreach ($headers as $header) { - $text = $header->nodeValue; - $tree->push([ + $tree = collect($headers)->map(function($header) { + $text = trim(str_replace("\xc2\xa0", '', $header->nodeValue)); + if (strlen($text) > 30) { + $text = substr($text, 0, 27) . '...'; + } + + return [ 'nodeName' => strtolower($header->nodeName), 'level' => intval(str_replace('h', '', $header->nodeName)), 'link' => '#' . $header->getAttribute('id'), - 'text' => strlen($text) > 30 ? substr($text, 0, 27) . '...' : $text - ]); - } + 'text' => $text, + ]; + })->filter(function($header) { + return strlen($header['text']) > 0; + }); // Normalise headers if only smaller headers have been used - if (count($tree) > 0) { - $minLevel = $tree->pluck('level')->min(); - $tree = $tree->map(function ($header) use ($minLevel) { - $header['level'] -= ($minLevel - 2); - return $header; - }); - } + $minLevel = $tree->pluck('level')->min(); + $tree = $tree->map(function ($header) use ($minLevel) { + $header['level'] -= ($minLevel - 2); + return $header; + }); + return $tree->toArray(); } diff --git a/app/Uploads/ImageRepo.php b/app/Uploads/ImageRepo.php index 38dd3066b..da0b7d379 100644 --- a/app/Uploads/ImageRepo.php +++ b/app/Uploads/ImageRepo.php @@ -230,7 +230,7 @@ class ImageRepo { $image->thumbs = [ 'gallery' => $this->getThumbnail($image, 150, 150, false), - 'display' => $this->getThumbnail($image, 840, null, true) + 'display' => $this->getThumbnail($image, 1680, null, true) ]; } diff --git a/resources/assets/js/components/markdown-editor.js b/resources/assets/js/components/markdown-editor.js index 770b4af50..5fa16ef6e 100644 --- a/resources/assets/js/components/markdown-editor.js +++ b/resources/assets/js/components/markdown-editor.js @@ -180,9 +180,20 @@ class MarkdownEditor { // Handle image paste cm.on('paste', (cm, event) => { - if (!event.clipboardData || !event.clipboardData.items) return; - for (let i = 0; i < event.clipboardData.items.length; i++) { - uploadImage(event.clipboardData.items[i].getAsFile()); + const clipboardItems = event.clipboardData.items; + if (!event.clipboardData || !clipboardItems) return; + + // Don't handle if clipboard includes text content + for (let clipboardItem of clipboardItems) { + if (clipboardItem.type.includes('text/')) { + return; + } + } + + for (let clipboardItem of clipboardItems) { + if (clipboardItem.type.includes("image")) { + uploadImage(clipboardItem.getAsFile()); + } } }); diff --git a/resources/assets/js/components/wysiwyg-editor.js b/resources/assets/js/components/wysiwyg-editor.js index 46fe967e0..614cfb80f 100644 --- a/resources/assets/js/components/wysiwyg-editor.js +++ b/resources/assets/js/components/wysiwyg-editor.js @@ -8,11 +8,20 @@ import DrawIO from "../services/drawio"; * @param editor */ function editorPaste(event, editor, wysiwygComponent) { - if (!event.clipboardData || !event.clipboardData.items) return; + const clipboardItems = event.clipboardData.items; + if (!event.clipboardData || !clipboardItems) return; - for (let clipboardItem of event.clipboardData.items) { - if (clipboardItem.type.indexOf("image") === -1) continue; - event.preventDefault(); + // Don't handle if clipboard includes text content + for (let clipboardItem of clipboardItems) { + if (clipboardItem.type.includes('text/')) { + return; + } + } + + for (let clipboardItem of clipboardItems) { + if (!clipboardItem.type.includes("image")) { + continue; + } const id = "image-" + Math.random().toString(16).slice(2); const loadingImage = window.baseUrl('/loading.gif'); diff --git a/resources/assets/sass/_layout.scss b/resources/assets/sass/_layout.scss index 9bb4e1c70..4be6edb56 100644 --- a/resources/assets/sass/_layout.scss +++ b/resources/assets/sass/_layout.scss @@ -59,7 +59,7 @@ } @include smaller-than($m) { - .grid.third { + .grid.third:not(.no-break) { grid-template-columns: 1fr 1fr; } .grid.half:not(.no-break), .grid.left-focus:not(.no-break), .grid.right-focus:not(.no-break) { @@ -81,7 +81,7 @@ } @include smaller-than($s) { - .grid.third { + .grid.third:not(.no-break) { grid-template-columns: 1fr; } } diff --git a/resources/assets/sass/_pages.scss b/resources/assets/sass/_pages.scss index d02f59e37..c58f6ef47 100755 --- a/resources/assets/sass/_pages.scss +++ b/resources/assets/sass/_pages.scss @@ -20,11 +20,10 @@ } } -@include smaller-than($m) { +@include smaller-than($s) { .page-edit-toolbar { overflow-x: scroll; overflow-y: visible; - z-index: 12; } .page-edit-toolbar .grid.third { display: block; @@ -35,24 +34,21 @@ } } -@include smaller-than($m) { - .page-edit-toolbar #save-button { - position: fixed; - z-index: 30; - border-radius: 50%; - width: 56px; - height: 56px; - font-size: 24px; - right: $-m; - bottom: $-s; - box-shadow: $bs-hover; - background-color: currentColor; - svg { - fill: #FFF; - } - span { - display: none; - } +.page-save-mobile-button { + position: fixed; + z-index: 30; + border-radius: 50%; + width: 56px; + height: 56px; + font-size: 24px; + right: $-m; + bottom: $-s; + box-shadow: $bs-hover; + background-color: currentColor; + text-align: center; + svg { + fill: #FFF; + margin-right: 0; } } diff --git a/resources/lang/nl/activities.php b/resources/lang/nl/activities.php index f6c3db309..021b6d21e 100644 --- a/resources/lang/nl/activities.php +++ b/resources/lang/nl/activities.php @@ -36,6 +36,14 @@ return [ 'book_delete_notification' => 'Boek Succesvol Verwijderd', 'book_sort' => 'sorteerde boek', 'book_sort_notification' => 'Boek Succesvol Gesorteerd', + + // Bookshelves + 'bookshelf_create' => 'maakte Boekenplank', + 'bookshelf_create_notification' => 'Boekenplank Succesvol Aangemaakt', + 'bookshelf_update' => 'veranderde boekenplank', + 'bookshelf_update_notification' => 'Boekenplank Succesvol Bijgewerkt', + 'bookshelf_delete' => 'verwijderde boekenplank', + 'bookshelf_delete_notification' => 'Boekenplank Succesvol Verwijderd', // Other 'commented_on' => 'reactie op', diff --git a/resources/lang/nl/common.php b/resources/lang/nl/common.php index fdfb90fb2..d44bd514d 100644 --- a/resources/lang/nl/common.php +++ b/resources/lang/nl/common.php @@ -1,35 +1,35 @@ 'Annuleren', 'confirm' => 'Bevestigen', 'back' => 'Terug', 'save' => 'Opslaan', 'continue' => 'Doorgaan', 'select' => 'Kies', + 'toggle_all' => 'Toggle Alles', 'more' => 'Meer', - - /** - * Form Labels - */ + + // Form Labels 'name' => 'Naam', 'description' => 'Beschrijving', 'role' => 'Rol', 'cover_image' => 'Omslagfoto', 'cover_image_description' => 'Deze afbeelding moet ongeveer 300x170px zijn.', - /** - * Actions - */ + + // Actions 'actions' => 'Acties', 'view' => 'Bekijk', + 'view_all' => 'Bekijk Alle', 'create' => 'Aanmaken', 'update' => 'Update', 'edit' => 'Bewerk', 'sort' => 'Sorteer', 'move' => 'Verplaats', + 'copy' => 'Kopiëren', + 'reply' => 'Beantwoorden', 'delete' => 'Verwijder', 'search' => 'Zoek', 'search_clear' => 'Zoekopdracht wissen', @@ -37,15 +37,22 @@ return [ 'remove' => 'Verwijderen', 'add' => 'Toevoegen', - /** - * Misc - */ + // Sort Options + 'sort_name' => 'Naam', + 'sort_created_at' => 'Aanmaakdatum', + 'sort_updated_at' => 'Gewijzigd op', + + // Misc 'deleted_user' => 'Verwijderde gebruiker', 'no_activity' => 'Geen activiteiten', 'no_items' => 'Geen items beschikbaar', 'back_to_top' => 'Terug naar boven', 'toggle_details' => 'Details Weergeven', 'toggle_thumbnails' => 'Thumbnails Weergeven', + 'details' => 'Details', + 'grid_view' => 'Grid weergave', + 'list_view' => 'Lijst weergave', + 'default' => 'Standaard', /** * Header @@ -53,9 +60,13 @@ return [ 'view_profile' => 'Profiel Weergeven', 'edit_profile' => 'Profiel Bewerken', + // Layout tabs + 'tab_info' => 'Info', + 'tab_content' => 'Inhoud', + /** * Email Content */ 'email_action_help' => 'Als je de knop ":actionText" niet werkt, kopieer en plak de onderstaande URL in je web browser:', 'email_rights' => 'Alle rechten voorbehouden', -]; \ No newline at end of file +]; diff --git a/resources/lang/nl/entities.php b/resources/lang/nl/entities.php index 29bb11a37..34142ad7f 100644 --- a/resources/lang/nl/entities.php +++ b/resources/lang/nl/entities.php @@ -65,16 +65,45 @@ return [ 'search_set_date' => 'Zet datum', 'search_update' => 'Update zoekresultaten', - /** - * Books - */ + // Shelves + 'shelf' => 'Boekenplank', + 'shelves' => 'Boekenplanken', + 'x_shelves' => ':count Boekenplank|:count Boekenplanken', + 'shelves_long' => 'Boekenplanken', + 'shelves_empty' => 'Er zijn geen boekenplanken aangemaakt', + 'shelves_create' => 'Nieuwe Boekenplank Aanmaken', + 'shelves_popular' => 'Populaire Boekenplanken', + 'shelves_new' => 'Nieuwe Boekenplanken', + 'shelves_popular_empty' => 'De meest populaire boekenplanken worden hier weergegeven.', + 'shelves_new_empty' => 'De meest recent aangemaakt boekenplanken worden hier weergeven.', + 'shelves_save' => 'Boekenplanken Opslaan', + 'shelves_books' => 'Boeken op deze plank', + 'shelves_add_books' => 'Toevoegen boeken aan deze plank', + 'shelves_drag_books' => 'Sleep boeken hier naartoe om deze toe te voegen aan deze plank', + 'shelves_empty_contents' => 'Er zijn geen boeken aan deze plank toegekend', + 'shelves_edit_and_assign' => 'Bewerk boekenplank om boeken toe te kennen.', + 'shelves_edit_named' => 'Bewerk Boekenplank :name', + 'shelves_edit' => 'Bewerk Boekenplank', + 'shelves_delete' => 'Verwijder Boekenplank', + 'shelves_delete_named' => 'Verwijder Boekenplank :name', + 'shelves_delete_explain' => "Deze actie verwijdert de boekenplank met naam ':name'. De boeken op deze plank worden niet verwijderd.", + 'shelves_delete_confirmation' => 'Weet je zeker dat je deze boekenplank wilt verwijderen?', + 'shelves_permissions' => 'Boekenplank Permissies', + 'shelves_permissions_updated' => 'Boekenplank Permissies Opgeslagen', + 'shelves_permissions_active' => 'Boekenplank Permissies Actief', + 'shelves_copy_permissions_to_books' => 'Kopieer Permissies naar Boeken', + 'shelves_copy_permissions' => 'Kopieer Permissies', + 'shelves_copy_permissions_explain' => 'Met deze actie worden de permissies van deze boekenplank gekopieerd naar alle boeken op de plank. Voordat deze actie wordt uitgevoerd, zorg dat de wijzigingen in de permissies van deze boekenplank zijn opgeslagen.', + 'shelves_copy_permission_success' => 'Boekenplank permissies gekopieerd naar :count boeken', + + // Books 'book' => 'Boek', 'books' => 'Boeken', - 'x_books' => ':count Boek|:count Boeken', + 'x_books' => ':count Boek|:count Boeken', 'books_empty' => 'Er zijn geen boeken aangemaakt', 'books_popular' => 'Populaire Boeken', 'books_recent' => 'Recente Boeken', - 'books_new' => 'Nieuwe Boeken', + 'books_new' => 'Nieuwe Boeken', 'books_popular_empty' => 'De meest populaire boeken worden hier weergegeven.', 'books_create' => 'Nieuw Boek Aanmaken', 'books_delete' => 'Boek Verwijderen', diff --git a/resources/lang/ru/common.php b/resources/lang/ru/common.php index 74a7f32d2..b4cef7764 100644 --- a/resources/lang/ru/common.php +++ b/resources/lang/ru/common.php @@ -26,7 +26,7 @@ return [ */ 'actions' => 'Действия', 'view' => 'Просмотр', - 'view_all' => 'View All', + 'view_all' => 'Показать все', 'create' => 'Создание', 'update' => 'Обновление', 'edit' => 'Редактировать', diff --git a/resources/lang/ru/entities.php b/resources/lang/ru/entities.php index b72297684..448e4e6a1 100644 --- a/resources/lang/ru/entities.php +++ b/resources/lang/ru/entities.php @@ -105,11 +105,13 @@ return [ */ 'shelf' => 'Полка', 'shelves' => 'Полки', + 'x_shelves' => ':count полок|:count полок', 'shelves_long' => 'Книжные полки', 'shelves_empty' => 'Полки не созданы', 'shelves_create' => 'Создать новую полку', 'shelves_popular' => 'Популярные полки', 'shelves_new' => 'Новые полки', + 'shelves_new_action' => 'Новая полка', 'shelves_popular_empty' => 'Популярные полки появятся здесь.', 'shelves_new_empty' => 'Последние созданные полки появятся здесь.', 'shelves_save' => 'Сохранить полку', diff --git a/resources/views/pages/form.blade.php b/resources/views/pages/form.blade.php index 34ded389c..4a473e536 100644 --- a/resources/views/pages/form.blade.php +++ b/resources/views/pages/form.blade.php @@ -12,7 +12,7 @@ {{--Header Bar--}}
-
+
@icon('back'){{ trans('common.back') }} @@ -49,7 +49,7 @@ {{-- Prevents button jumping on menu show --}}
- +
@@ -120,4 +120,6 @@ @endif + + \ No newline at end of file diff --git a/resources/views/search/all.blade.php b/resources/views/search/all.blade.php index fba67abf9..03c0b93e7 100644 --- a/resources/views/search/all.blade.php +++ b/resources/views/search/all.blade.php @@ -190,6 +190,11 @@

{{ trans('entities.search_results') }}

+
{{ trans_choice('entities.search_total_results_found', $totalResults, ['count' => $totalResults]) }}
@include('partials.entity-list', ['entities' => $entities, 'showPath' => true]) diff --git a/tests/HelpersTest.php b/tests/Unit/HelpersTest.php similarity index 100% rename from tests/HelpersTest.php rename to tests/Unit/HelpersTest.php diff --git a/tests/Unit/PageRepoTest.php b/tests/Unit/PageRepoTest.php new file mode 100644 index 000000000..36addcbe4 --- /dev/null +++ b/tests/Unit/PageRepoTest.php @@ -0,0 +1,32 @@ +pageRepo = app()->make(PageRepo::class); + } + + public function test_get_page_nav_does_not_show_empty_titles() + { + $content = '

Hello

 

'; + $navMap = $this->pageRepo->getPageNav($content); + + $this->assertCount(1, $navMap); + $this->assertArraySubset([ + 'nodeName' => 'h1', + 'link' => '#testa', + 'text' => 'Hello' + ], $navMap[0]); + } + +} \ No newline at end of file