diff --git a/app/References/ReferenceFetcher.php b/app/References/ReferenceFetcher.php index 655ea7c09eb..1c9664f45a9 100644 --- a/app/References/ReferenceFetcher.php +++ b/app/References/ReferenceFetcher.php @@ -41,7 +41,8 @@ protected function queryReferencesToEntity(Entity $entity): Builder { $baseQuery = Reference::query() ->where('to_type', '=', $entity->getMorphClass()) - ->where('to_id', '=', $entity->id); + ->where('to_id', '=', $entity->id) + ->whereHas('from'); return $this->permissions->restrictEntityRelationQuery( $baseQuery, diff --git a/app/Util/HtmlDescriptionFilter.php b/app/Util/HtmlDescriptionFilter.php index 7287586d16f..cb091b869f8 100644 --- a/app/Util/HtmlDescriptionFilter.php +++ b/app/Util/HtmlDescriptionFilter.php @@ -20,7 +20,7 @@ class HtmlDescriptionFilter */ protected static array $allowedAttrsByElements = [ 'p' => [], - 'a' => ['href', 'title'], + 'a' => ['href', 'title', 'target'], 'ol' => [], 'ul' => [], 'li' => [], diff --git a/resources/js/code/index.mjs b/resources/js/code/index.mjs index d252f8f4101..ab31e3f74e4 100644 --- a/resources/js/code/index.mjs +++ b/resources/js/code/index.mjs @@ -48,14 +48,16 @@ function highlightElem(elem) { const content = elem.textContent.trimEnd(); let langName = ''; + let innerCodeDirection = ''; if (innerCodeElem !== null) { langName = innerCodeElem.className.replace('language-', ''); + innerCodeDirection = innerCodeElem.getAttribute('dir'); } const wrapper = document.createElement('div'); elem.parentNode.insertBefore(wrapper, elem); - const direction = innerCodeElem.getAttribute('dir') || elem.getAttribute('dir') || ''; + const direction = innerCodeDirection || elem.getAttribute('dir') || ''; if (direction) { wrapper.setAttribute('dir', direction); } diff --git a/resources/js/wysiwyg/config.js b/resources/js/wysiwyg/config.js index e5a780d18e9..1666aa50066 100644 --- a/resources/js/wysiwyg/config.js +++ b/resources/js/wysiwyg/config.js @@ -348,7 +348,7 @@ export function buildForInput(options) { toolbar: 'bold italic link bullist numlist', content_style: getContentStyle(options), file_picker_types: 'file', - valid_elements: 'p,a[href|title],ol,ul,li,strong,em,br', + valid_elements: 'p,a[href|title|target],ol,ul,li,strong,em,br', file_picker_callback: filePickerCallback, init_instance_callback(editor) { addCustomHeadContent(editor.getDoc()); diff --git a/resources/sass/_forms.scss b/resources/sass/_forms.scss index 8c277c2b501..e480531fc52 100644 --- a/resources/sass/_forms.scss +++ b/resources/sass/_forms.scss @@ -128,8 +128,9 @@ body { display: block; background-color: #fff; - padding-inline-start: 16px; - padding-inline-end: 16px; + padding-inline-start: 12px; + padding-inline-end: 12px; + max-width: 864px; } [drawio-diagram]:hover { outline: 2px solid var(--color-primary); diff --git a/resources/sass/_tinymce.scss b/resources/sass/_tinymce.scss index 7e443ff5a6b..29843e4246f 100644 --- a/resources/sass/_tinymce.scss +++ b/resources/sass/_tinymce.scss @@ -21,6 +21,7 @@ padding-block-end: 1rem; outline: 0; display: block; + max-width: 870px; } .wysiwyg-input.mce-content-body { diff --git a/tests/Entity/BookTest.php b/tests/Entity/BookTest.php index 04dff293fac..51bf65d10bb 100644 --- a/tests/Entity/BookTest.php +++ b/tests/Entity/BookTest.php @@ -266,8 +266,8 @@ public function test_description_limited_to_specific_html() { $book = $this->entities->book(); - $input = '

Test

Contenta

Hello

'; - $expected = '

Contenta

'; + $input = '

Test

Contenta

Hello

'; + $expected = '

Contenta

'; $this->asEditor()->put($book->getUrl(), [ 'name' => $book->name, diff --git a/tests/References/ReferencesTest.php b/tests/References/ReferencesTest.php index 715f7143534..f8698d02885 100644 --- a/tests/References/ReferencesTest.php +++ b/tests/References/ReferencesTest.php @@ -271,7 +271,31 @@ public function test_description_links_from_book_chapter_shelf_updated_on_url_ch } } - protected function createReference(Model $from, Model $to) + public function test_reference_from_deleted_item_does_not_count_or_show_in_references_page() + { + $page = $this->entities->page(); + $referencingPageA = $this->entities->page(); + $referencingPageB = $this->entities->page(); + + $this->asEditor(); + $this->createReference($referencingPageA, $page); + $this->createReference($referencingPageB, $page); + + $resp = $this->get($page->getUrl()); + $resp->assertSee('Referenced by 2 items'); + + $this->delete($referencingPageA->getUrl()); + + $resp = $this->get($page->getUrl()); + $resp->assertSee('Referenced by 1 item'); + + $resp = $this->get($page->getUrl('/references')); + $resp->assertOk(); + $resp->assertSee($referencingPageB->getUrl()); + $resp->assertDontSee($referencingPageA->getUrl()); + } + + protected function createReference(Model $from, Model $to): void { (new Reference())->forceFill([ 'from_type' => $from->getMorphClass(),