mirror of
https://github.com/BookStackApp/BookStack.git
synced 2024-10-01 01:36:00 -04:00
commit
ee40adf11a
@ -41,7 +41,8 @@ class ReferenceFetcher
|
|||||||
{
|
{
|
||||||
$baseQuery = Reference::query()
|
$baseQuery = Reference::query()
|
||||||
->where('to_type', '=', $entity->getMorphClass())
|
->where('to_type', '=', $entity->getMorphClass())
|
||||||
->where('to_id', '=', $entity->id);
|
->where('to_id', '=', $entity->id)
|
||||||
|
->whereHas('from');
|
||||||
|
|
||||||
return $this->permissions->restrictEntityRelationQuery(
|
return $this->permissions->restrictEntityRelationQuery(
|
||||||
$baseQuery,
|
$baseQuery,
|
||||||
|
@ -20,7 +20,7 @@ class HtmlDescriptionFilter
|
|||||||
*/
|
*/
|
||||||
protected static array $allowedAttrsByElements = [
|
protected static array $allowedAttrsByElements = [
|
||||||
'p' => [],
|
'p' => [],
|
||||||
'a' => ['href', 'title'],
|
'a' => ['href', 'title', 'target'],
|
||||||
'ol' => [],
|
'ol' => [],
|
||||||
'ul' => [],
|
'ul' => [],
|
||||||
'li' => [],
|
'li' => [],
|
||||||
|
@ -48,14 +48,16 @@ function highlightElem(elem) {
|
|||||||
const content = elem.textContent.trimEnd();
|
const content = elem.textContent.trimEnd();
|
||||||
|
|
||||||
let langName = '';
|
let langName = '';
|
||||||
|
let innerCodeDirection = '';
|
||||||
if (innerCodeElem !== null) {
|
if (innerCodeElem !== null) {
|
||||||
langName = innerCodeElem.className.replace('language-', '');
|
langName = innerCodeElem.className.replace('language-', '');
|
||||||
|
innerCodeDirection = innerCodeElem.getAttribute('dir');
|
||||||
}
|
}
|
||||||
|
|
||||||
const wrapper = document.createElement('div');
|
const wrapper = document.createElement('div');
|
||||||
elem.parentNode.insertBefore(wrapper, elem);
|
elem.parentNode.insertBefore(wrapper, elem);
|
||||||
|
|
||||||
const direction = innerCodeElem.getAttribute('dir') || elem.getAttribute('dir') || '';
|
const direction = innerCodeDirection || elem.getAttribute('dir') || '';
|
||||||
if (direction) {
|
if (direction) {
|
||||||
wrapper.setAttribute('dir', direction);
|
wrapper.setAttribute('dir', direction);
|
||||||
}
|
}
|
||||||
|
@ -348,7 +348,7 @@ export function buildForInput(options) {
|
|||||||
toolbar: 'bold italic link bullist numlist',
|
toolbar: 'bold italic link bullist numlist',
|
||||||
content_style: getContentStyle(options),
|
content_style: getContentStyle(options),
|
||||||
file_picker_types: 'file',
|
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,
|
file_picker_callback: filePickerCallback,
|
||||||
init_instance_callback(editor) {
|
init_instance_callback(editor) {
|
||||||
addCustomHeadContent(editor.getDoc());
|
addCustomHeadContent(editor.getDoc());
|
||||||
|
@ -128,8 +128,9 @@
|
|||||||
body {
|
body {
|
||||||
display: block;
|
display: block;
|
||||||
background-color: #fff;
|
background-color: #fff;
|
||||||
padding-inline-start: 16px;
|
padding-inline-start: 12px;
|
||||||
padding-inline-end: 16px;
|
padding-inline-end: 12px;
|
||||||
|
max-width: 864px;
|
||||||
}
|
}
|
||||||
[drawio-diagram]:hover {
|
[drawio-diagram]:hover {
|
||||||
outline: 2px solid var(--color-primary);
|
outline: 2px solid var(--color-primary);
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
padding-block-end: 1rem;
|
padding-block-end: 1rem;
|
||||||
outline: 0;
|
outline: 0;
|
||||||
display: block;
|
display: block;
|
||||||
|
max-width: 870px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.wysiwyg-input.mce-content-body {
|
.wysiwyg-input.mce-content-body {
|
||||||
|
@ -266,8 +266,8 @@ class BookTest extends TestCase
|
|||||||
{
|
{
|
||||||
$book = $this->entities->book();
|
$book = $this->entities->book();
|
||||||
|
|
||||||
$input = '<h1>Test</h1><p id="abc" href="beans">Content<a href="#cat" data-a="b">a</a><section>Hello</section></p>';
|
$input = '<h1>Test</h1><p id="abc" href="beans">Content<a href="#cat" target="_blank" data-a="b">a</a><section>Hello</section></p>';
|
||||||
$expected = '<p>Content<a href="#cat">a</a></p>';
|
$expected = '<p>Content<a href="#cat" target="_blank">a</a></p>';
|
||||||
|
|
||||||
$this->asEditor()->put($book->getUrl(), [
|
$this->asEditor()->put($book->getUrl(), [
|
||||||
'name' => $book->name,
|
'name' => $book->name,
|
||||||
|
@ -271,7 +271,31 @@ class ReferencesTest extends TestCase
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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([
|
(new Reference())->forceFill([
|
||||||
'from_type' => $from->getMorphClass(),
|
'from_type' => $from->getMorphClass(),
|
||||||
|
Loading…
Reference in New Issue
Block a user