Merge branch 'master' into patch-5

This commit is contained in:
Dan Brown 2019-05-19 15:40:54 +01:00 committed by GitHub
commit 60013f776a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 175 additions and 66 deletions

View File

@ -422,25 +422,29 @@ class PageRepo extends EntityRepo
return []; return [];
} }
$tree = collect([]); $tree = collect($headers)->map(function($header) {
foreach ($headers as $header) { $text = trim(str_replace("\xc2\xa0", '', $header->nodeValue));
$text = $header->nodeValue; if (strlen($text) > 30) {
$tree->push([ $text = substr($text, 0, 27) . '...';
}
return [
'nodeName' => strtolower($header->nodeName), 'nodeName' => strtolower($header->nodeName),
'level' => intval(str_replace('h', '', $header->nodeName)), 'level' => intval(str_replace('h', '', $header->nodeName)),
'link' => '#' . $header->getAttribute('id'), '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 // Normalise headers if only smaller headers have been used
if (count($tree) > 0) { $minLevel = $tree->pluck('level')->min();
$minLevel = $tree->pluck('level')->min(); $tree = $tree->map(function ($header) use ($minLevel) {
$tree = $tree->map(function ($header) use ($minLevel) { $header['level'] -= ($minLevel - 2);
$header['level'] -= ($minLevel - 2); return $header;
return $header; });
});
}
return $tree->toArray(); return $tree->toArray();
} }

View File

@ -230,7 +230,7 @@ class ImageRepo
{ {
$image->thumbs = [ $image->thumbs = [
'gallery' => $this->getThumbnail($image, 150, 150, false), 'gallery' => $this->getThumbnail($image, 150, 150, false),
'display' => $this->getThumbnail($image, 840, null, true) 'display' => $this->getThumbnail($image, 1680, null, true)
]; ];
} }

View File

@ -180,9 +180,20 @@ class MarkdownEditor {
// Handle image paste // Handle image paste
cm.on('paste', (cm, event) => { cm.on('paste', (cm, event) => {
if (!event.clipboardData || !event.clipboardData.items) return; const clipboardItems = event.clipboardData.items;
for (let i = 0; i < event.clipboardData.items.length; i++) { if (!event.clipboardData || !clipboardItems) return;
uploadImage(event.clipboardData.items[i].getAsFile());
// 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());
}
} }
}); });

View File

@ -8,11 +8,20 @@ import DrawIO from "../services/drawio";
* @param editor * @param editor
*/ */
function editorPaste(event, editor, wysiwygComponent) { 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) { // Don't handle if clipboard includes text content
if (clipboardItem.type.indexOf("image") === -1) continue; for (let clipboardItem of clipboardItems) {
event.preventDefault(); 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 id = "image-" + Math.random().toString(16).slice(2);
const loadingImage = window.baseUrl('/loading.gif'); const loadingImage = window.baseUrl('/loading.gif');

View File

@ -59,7 +59,7 @@
} }
@include smaller-than($m) { @include smaller-than($m) {
.grid.third { .grid.third:not(.no-break) {
grid-template-columns: 1fr 1fr; grid-template-columns: 1fr 1fr;
} }
.grid.half:not(.no-break), .grid.left-focus:not(.no-break), .grid.right-focus:not(.no-break) { .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) { @include smaller-than($s) {
.grid.third { .grid.third:not(.no-break) {
grid-template-columns: 1fr; grid-template-columns: 1fr;
} }
} }

View File

@ -20,11 +20,10 @@
} }
} }
@include smaller-than($m) { @include smaller-than($s) {
.page-edit-toolbar { .page-edit-toolbar {
overflow-x: scroll; overflow-x: scroll;
overflow-y: visible; overflow-y: visible;
z-index: 12;
} }
.page-edit-toolbar .grid.third { .page-edit-toolbar .grid.third {
display: block; display: block;
@ -35,24 +34,21 @@
} }
} }
@include smaller-than($m) { .page-save-mobile-button {
.page-edit-toolbar #save-button { position: fixed;
position: fixed; z-index: 30;
z-index: 30; border-radius: 50%;
border-radius: 50%; width: 56px;
width: 56px; height: 56px;
height: 56px; font-size: 24px;
font-size: 24px; right: $-m;
right: $-m; bottom: $-s;
bottom: $-s; box-shadow: $bs-hover;
box-shadow: $bs-hover; background-color: currentColor;
background-color: currentColor; text-align: center;
svg { svg {
fill: #FFF; fill: #FFF;
} margin-right: 0;
span {
display: none;
}
} }
} }

View File

@ -37,6 +37,14 @@ return [
'book_sort' => 'sorteerde boek', 'book_sort' => 'sorteerde boek',
'book_sort_notification' => 'Boek Succesvol Gesorteerd', '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 // Other
'commented_on' => 'reactie op', 'commented_on' => 'reactie op',
]; ];

View File

@ -1,35 +1,35 @@
<?php <?php
return [ return [
/**
* Buttons // Buttons
*/
'cancel' => 'Annuleren', 'cancel' => 'Annuleren',
'confirm' => 'Bevestigen', 'confirm' => 'Bevestigen',
'back' => 'Terug', 'back' => 'Terug',
'save' => 'Opslaan', 'save' => 'Opslaan',
'continue' => 'Doorgaan', 'continue' => 'Doorgaan',
'select' => 'Kies', 'select' => 'Kies',
'toggle_all' => 'Toggle Alles',
'more' => 'Meer', 'more' => 'Meer',
/** // Form Labels
* Form Labels
*/
'name' => 'Naam', 'name' => 'Naam',
'description' => 'Beschrijving', 'description' => 'Beschrijving',
'role' => 'Rol', 'role' => 'Rol',
'cover_image' => 'Omslagfoto', 'cover_image' => 'Omslagfoto',
'cover_image_description' => 'Deze afbeelding moet ongeveer 300x170px zijn.', 'cover_image_description' => 'Deze afbeelding moet ongeveer 300x170px zijn.',
/**
* Actions // Actions
*/
'actions' => 'Acties', 'actions' => 'Acties',
'view' => 'Bekijk', 'view' => 'Bekijk',
'view_all' => 'Bekijk Alle',
'create' => 'Aanmaken', 'create' => 'Aanmaken',
'update' => 'Update', 'update' => 'Update',
'edit' => 'Bewerk', 'edit' => 'Bewerk',
'sort' => 'Sorteer', 'sort' => 'Sorteer',
'move' => 'Verplaats', 'move' => 'Verplaats',
'copy' => 'Kopiëren',
'reply' => 'Beantwoorden',
'delete' => 'Verwijder', 'delete' => 'Verwijder',
'search' => 'Zoek', 'search' => 'Zoek',
'search_clear' => 'Zoekopdracht wissen', 'search_clear' => 'Zoekopdracht wissen',
@ -37,15 +37,22 @@ return [
'remove' => 'Verwijderen', 'remove' => 'Verwijderen',
'add' => 'Toevoegen', 'add' => 'Toevoegen',
/** // Sort Options
* Misc 'sort_name' => 'Naam',
*/ 'sort_created_at' => 'Aanmaakdatum',
'sort_updated_at' => 'Gewijzigd op',
// Misc
'deleted_user' => 'Verwijderde gebruiker', 'deleted_user' => 'Verwijderde gebruiker',
'no_activity' => 'Geen activiteiten', 'no_activity' => 'Geen activiteiten',
'no_items' => 'Geen items beschikbaar', 'no_items' => 'Geen items beschikbaar',
'back_to_top' => 'Terug naar boven', 'back_to_top' => 'Terug naar boven',
'toggle_details' => 'Details Weergeven', 'toggle_details' => 'Details Weergeven',
'toggle_thumbnails' => 'Thumbnails Weergeven', 'toggle_thumbnails' => 'Thumbnails Weergeven',
'details' => 'Details',
'grid_view' => 'Grid weergave',
'list_view' => 'Lijst weergave',
'default' => 'Standaard',
/** /**
* Header * Header
@ -53,6 +60,10 @@ return [
'view_profile' => 'Profiel Weergeven', 'view_profile' => 'Profiel Weergeven',
'edit_profile' => 'Profiel Bewerken', 'edit_profile' => 'Profiel Bewerken',
// Layout tabs
'tab_info' => 'Info',
'tab_content' => 'Inhoud',
/** /**
* Email Content * Email Content
*/ */

View File

@ -65,16 +65,45 @@ return [
'search_set_date' => 'Zet datum', 'search_set_date' => 'Zet datum',
'search_update' => 'Update zoekresultaten', 'search_update' => 'Update zoekresultaten',
/** // Shelves
* Books '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', 'book' => 'Boek',
'books' => 'Boeken', 'books' => 'Boeken',
'x_books' => ':count Boek|:count Boeken', 'x_books' => ':count Boek|:count Boeken',
'books_empty' => 'Er zijn geen boeken aangemaakt', 'books_empty' => 'Er zijn geen boeken aangemaakt',
'books_popular' => 'Populaire Boeken', 'books_popular' => 'Populaire Boeken',
'books_recent' => 'Recente Boeken', 'books_recent' => 'Recente Boeken',
'books_new' => 'Nieuwe Boeken', 'books_new' => 'Nieuwe Boeken',
'books_popular_empty' => 'De meest populaire boeken worden hier weergegeven.', 'books_popular_empty' => 'De meest populaire boeken worden hier weergegeven.',
'books_create' => 'Nieuw Boek Aanmaken', 'books_create' => 'Nieuw Boek Aanmaken',
'books_delete' => 'Boek Verwijderen', 'books_delete' => 'Boek Verwijderen',

View File

@ -26,7 +26,7 @@ return [
*/ */
'actions' => 'Действия', 'actions' => 'Действия',
'view' => 'Просмотр', 'view' => 'Просмотр',
'view_all' => 'View All', 'view_all' => 'Показать все',
'create' => 'Создание', 'create' => 'Создание',
'update' => 'Обновление', 'update' => 'Обновление',
'edit' => 'Редактировать', 'edit' => 'Редактировать',

View File

@ -105,11 +105,13 @@ return [
*/ */
'shelf' => 'Полка', 'shelf' => 'Полка',
'shelves' => 'Полки', 'shelves' => 'Полки',
'x_shelves' => ':count полок|:count полок',
'shelves_long' => 'Книжные полки', 'shelves_long' => 'Книжные полки',
'shelves_empty' => 'Полки не созданы', 'shelves_empty' => 'Полки не созданы',
'shelves_create' => 'Создать новую полку', 'shelves_create' => 'Создать новую полку',
'shelves_popular' => 'Популярные полки', 'shelves_popular' => 'Популярные полки',
'shelves_new' => 'Новые полки', 'shelves_new' => 'Новые полки',
'shelves_new_action' => 'Новая полка',
'shelves_popular_empty' => 'Популярные полки появятся здесь.', 'shelves_popular_empty' => 'Популярные полки появятся здесь.',
'shelves_new_empty' => 'Последние созданные полки появятся здесь.', 'shelves_new_empty' => 'Последние созданные полки появятся здесь.',
'shelves_save' => 'Сохранить полку', 'shelves_save' => 'Сохранить полку',

View File

@ -12,7 +12,7 @@
{{--Header Bar--}} {{--Header Bar--}}
<div class="primary-background-light toolbar page-edit-toolbar"> <div class="primary-background-light toolbar page-edit-toolbar">
<div class="grid third v-center"> <div class="grid third no-break v-center">
<div class="action-buttons text-left px-m py-xs"> <div class="action-buttons text-left px-m py-xs">
<a href="{{ back()->getTargetUrl() }}" class="text-button text-primary">@icon('back')<span class="hide-under-l">{{ trans('common.back') }}</span></a> <a href="{{ back()->getTargetUrl() }}" class="text-button text-primary">@icon('back')<span class="hide-under-l">{{ trans('common.back') }}</span></a>
@ -49,7 +49,7 @@
<span>{{-- Prevents button jumping on menu show --}}</span> <span>{{-- Prevents button jumping on menu show --}}</span>
</div> </div>
<button type="submit" id="save-button" class="float-left text-primary text-button text-pos-hover">@icon('save')<span>{{ trans('entities.pages_save') }}</span></button> <button type="submit" id="save-button" class="float-left text-primary text-button text-pos-hover hide-under-m">@icon('save')<span>{{ trans('entities.pages_save') }}</span></button>
</div> </div>
</div> </div>
</div> </div>
@ -120,4 +120,6 @@
@endif @endif
</div> </div>
<button type="submit" id="save-button-mobile" title="{{ trans('entities.pages_save') }}" class="text-primary text-button hide-over-m page-save-mobile-button">@icon('save')</button>
</div> </div>

View File

@ -190,6 +190,11 @@
<div> <div>
<div v-pre class="card content-wrap"> <div v-pre class="card content-wrap">
<h1 class="list-heading">{{ trans('entities.search_results') }}</h1> <h1 class="list-heading">{{ trans('entities.search_results') }}</h1>
<form action="{{ baseUrl('/search') }}" method="GET" class="search-box flexible hide-over-l">
<input value="{{$searchTerm}}" type="text" name="term" placeholder="{{ trans('common.search') }}">
<button type="submit">@icon('search')</button>
<button v-if="searching" v-cloak class="search-box-cancel text-neg" v-on:click="clearSearch" type="button">@icon('close')</button>
</form>
<h6 class="text-muted">{{ trans_choice('entities.search_total_results_found', $totalResults, ['count' => $totalResults]) }}</h6> <h6 class="text-muted">{{ trans_choice('entities.search_total_results_found', $totalResults, ['count' => $totalResults]) }}</h6>
<div class="book-contents"> <div class="book-contents">
@include('partials.entity-list', ['entities' => $entities, 'showPath' => true]) @include('partials.entity-list', ['entities' => $entities, 'showPath' => true])

View File

@ -0,0 +1,32 @@
<?php
namespace Tests;
use BookStack\Entities\Repos\PageRepo;
class PageRepoTest extends TestCase
{
/**
* @var PageRepo $pageRepo
*/
protected $pageRepo;
protected function setUp()
{
parent::setUp();
$this->pageRepo = app()->make(PageRepo::class);
}
public function test_get_page_nav_does_not_show_empty_titles()
{
$content = '<h1 id="testa">Hello</h1><h2 id="testb">&nbsp;</h2><h3 id="testc"></h3>';
$navMap = $this->pageRepo->getPageNav($content);
$this->assertCount(1, $navMap);
$this->assertArraySubset([
'nodeName' => 'h1',
'link' => '#testa',
'text' => 'Hello'
], $navMap[0]);
}
}