-
- {fieldData.schema.label}
-
- {fieldData.field.label}
-
-
- {#each fieldData.nodes as node}
- {#if node._file?.path}
-
- {:else}
-
- {/if}
- {/each}
-
-
+{#each backlinks as backlink}
+
{/each}
-{#if Object.entries(parentEdgesByField).length > 0}
-
-
-
-{/if}
-
-{#if Object.entries(childrenEdgesByField).length > 0}
-
-
-
-{/if}
-
-{#each Object.entries(childrenEdgesByField) as [fieldName, fieldData]}
-
-
{fieldData.field.label}
-
- {#each fieldData.nodes as node}
- {#if fieldData.field.info.ui === "file"}
-
- {:else}
-
- {/if}
- {/each}
-
-
-{/each}
-
-
diff --git a/front/js/svelte/records/block/Block.svelte b/front/js/svelte/records/block/Block.svelte
deleted file mode 100644
index d96ed2c..0000000
--- a/front/js/svelte/records/block/Block.svelte
+++ /dev/null
@@ -1,37 +0,0 @@
-
-
-
-
-
-
-
- {#each value as blockItemData (blockItemData.id)}
-
-
-
-
- {/each}
-
-
\ No newline at end of file
diff --git a/front/js/svelte/records/block/BlockButtons.svelte b/front/js/svelte/records/block/BlockButtons.svelte
deleted file mode 100644
index 73a2d44..0000000
--- a/front/js/svelte/records/block/BlockButtons.svelte
+++ /dev/null
@@ -1,61 +0,0 @@
-
-
-
- {#if showOptions}
-
- {#each blockSchema.fields as validUi}
-
-
-
- {/each}
-
-
- {/if}
-
-
diff --git a/front/js/svelte/records/block/BlockElements.svelte b/front/js/svelte/records/block/BlockElements.svelte
deleted file mode 100644
index 1868ea6..0000000
--- a/front/js/svelte/records/block/BlockElements.svelte
+++ /dev/null
@@ -1,158 +0,0 @@
-
-
-
-
-
{block.meta.label}
-
-
-
-
-
- {#if block.meta.info.name === "heading"}
-
-
-
- {:else if block.meta.info.name === "textarea"}
-
-
-
- {:else if block.meta.info.name === "rich"}
-
- {:else if block.meta.info.name === "markdown"}
-
- {:else if block.meta.info.name === "file"}
-
- {:else if block.meta.info.name === "reference"}
-
- {/if}
-
-
-
-
-
\ No newline at end of file
diff --git a/front/js/svelte/records/block/block.js b/front/js/svelte/records/block/block.js
deleted file mode 100644
index 2b5cb1d..0000000
--- a/front/js/svelte/records/block/block.js
+++ /dev/null
@@ -1,25 +0,0 @@
-import {randomId} from "../../../helpers.js";
-
-export function insertBlock(blockData, blockField, afterBlockId = null) {
-
- if (!afterBlockId) {
- return [{
- meta: blockField,
- id: randomId(),
- value: null
- }, ...blockData];
- }
-
- return blockData.reduce((carry, block) => {
- carry.push(block)
- if (block.id === afterBlockId) {
- carry.push({
- meta: blockField,
- id: randomId(),
- value: null
- });
- }
- return carry;
- }, []);
-
-}
\ No newline at end of file
diff --git a/front/js/svelte/records/block/elements/File.svelte b/front/js/svelte/records/block/elements/File.svelte
deleted file mode 100644
index 0a26796..0000000
--- a/front/js/svelte/records/block/elements/File.svelte
+++ /dev/null
@@ -1,105 +0,0 @@
-
-
-
-
- {#if block.meta.collections.length === 1}
-
- {:else}
-
-
-
-
- {/if}
-
-{#if references.length > 0}
-
- {#each references as reference (reference.id)}
-
- {/each}
-
-{/if}
-
-
\ No newline at end of file
diff --git a/front/js/svelte/records/block/elements/Heading.svelte b/front/js/svelte/records/block/elements/Heading.svelte
deleted file mode 100644
index 00b3574..0000000
--- a/front/js/svelte/records/block/elements/Heading.svelte
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
-
diff --git a/front/js/svelte/records/block/elements/Markdown.svelte b/front/js/svelte/records/block/elements/Markdown.svelte
deleted file mode 100644
index d65430a..0000000
--- a/front/js/svelte/records/block/elements/Markdown.svelte
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/front/js/svelte/records/block/elements/Reference.svelte b/front/js/svelte/records/block/elements/Reference.svelte
deleted file mode 100644
index aaac785..0000000
--- a/front/js/svelte/records/block/elements/Reference.svelte
+++ /dev/null
@@ -1,71 +0,0 @@
-
-
-
-
-
-{#if references.length > 0}
-
- {#each references as reference (reference.id)}
-
- {/each}
-
-{/if}
-
diff --git a/front/js/svelte/records/block/elements/Rich.svelte b/front/js/svelte/records/block/elements/Rich.svelte
deleted file mode 100644
index 192b687..0000000
--- a/front/js/svelte/records/block/elements/Rich.svelte
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
diff --git a/front/js/svelte/records/block/elements/Textarea.svelte b/front/js/svelte/records/block/elements/Textarea.svelte
deleted file mode 100644
index 8e7bf49..0000000
--- a/front/js/svelte/records/block/elements/Textarea.svelte
+++ /dev/null
@@ -1,39 +0,0 @@
-
-
-
-
-
-
-
diff --git a/front/js/svelte/records/elements/Reference.svelte b/front/js/svelte/records/elements/Reference.svelte
index 58e20fb..cbf5ffe 100644
--- a/front/js/svelte/records/elements/Reference.svelte
+++ b/front/js/svelte/records/elements/Reference.svelte
@@ -63,7 +63,6 @@
{#each references as reference (reference.id)}
- import {getContext} from "svelte";
- import {previewTitle} from "../Preview";
- import {getErrorMessage} from "./errorMessage";
- import {sortByField} from "../../edges/sortEdges";
- import ReferenceInlineButtons from "./ReferenceInlineButtons.svelte";
- import Sortable from "../../libs/Sortable.svelte";
- import RenderField from "../../content/RenderField.svelte";
- import Icon from "../../common/Icon.svelte";
- import {insertEdges} from "./reference.js";
-
- const channel = getContext("channel");
- export let field;
- export let record;
- export let graph;
- export let validationErrors;
- $: errorMessage = getErrorMessage(validationErrors, field.name);
-
- $: references = graph.edges
- .filter((edge) => edge.field === field.name)
- .map((edge) => {
- return graph.records.find((increc) => increc.id === edge.target && record.id === edge.source);
- }).filter((rec) => (rec?.id ? true : false)) ?? [];
-
- let collections = channel.schemas.filter((aschema) =>
- field.collections.includes(aschema.name)
- );
-
- let collection = channel.schemas.filter((aschema) =>
- field.collections.includes(aschema.name)
- )[0];
-
- function removeReference(e, recordId) {
- e.preventDefault();
- graph.edges = graph.edges.filter(
- (edge) => !(edge.source === record.id && edge.target === recordId && edge.field === field.name)
- );
- }
-
- function sendToTop(e, recordId) {
- e.preventDefault();
- let ref = graph.edges.find(
- (edge) => edge.source === record.id && edge.target === recordId && edge.field === field.name
- );
- removeReference(e, recordId);
- graph.edges = [ref, ...graph.edges];
- }
-
- function sendToBottom(e, recordId) {
- e.preventDefault();
- let ref = graph.edges.find(
- (edge) => edge.source === record.id && edge.target === recordId && edge.field === field.name
- );
- removeReference(e, recordId);
- graph.edges = [...graph.edges, ref];
- }
-
-
- function reorder(e) {
- graph.edges = sortByField(e.detail.source, e.detail.target, graph.edges, field.name, references);
- }
-
-
- function insert(e) {
- e.preventDefault();
- graph = insertEdges(graph, record, e.detail.records, field.name, e.detail.action);
- }
-
- $:visibleColumns = [];
- // $: visibleColumns = collection.fields
- // .filter((f) => f.ui !== "tab" && !f.trashed)
- // .filter((f) => {
- // return collection.visible.includes(f.name);
- // });
-
-
-{#if errorMessage}
-
- {errorMessage}
-
-{/if}
-
-
-
-{#if references.length > 0}
-
-
-
-
- |
-
- {#each visibleColumns as field}
- {field.label} |
- {/each}
- |
-
-
-
- {#each references as record,index (record.id)}
-
- |
-
- |
- {#each visibleColumns as field, index}
-
-
- |
- {/each}
-
-
- {#if references.length > 30 && index > 0}
-
- {/if}
- {#if references.length > 30 && index + 1 < references.length}
-
- {/if}
- |
-
- {/each}
-
-
-
-{/if}
diff --git a/front/js/svelte/records/header/ContentTabs.svelte b/front/js/svelte/records/header/ContentTabs.svelte
index d8fcead..2f9b701 100644
--- a/front/js/svelte/records/header/ContentTabs.svelte
+++ b/front/js/svelte/records/header/ContentTabs.svelte
@@ -12,7 +12,7 @@
name: "",
};
let graphTab = {
- label: "Graph",
+ label: "Backlinks",
name: "_graph",
};
if (isCreateMode) {
diff --git a/front/sass/_dropdown.scss b/front/sass/_dropdown.scss
index 0cf4209..0250233 100644
--- a/front/sass/_dropdown.scss
+++ b/front/sass/_dropdown.scss
@@ -26,11 +26,11 @@
top: 35px;
min-width: max-content;
- & .orientation-right {
+ &.orientation-right {
right: 0;
}
- & .orientation-left {
+ &.orientation-left {
left: 0;
}
diff --git a/src/Http/Controller/RecordController.php b/src/Http/Controller/RecordController.php
index 6c5c663..d796b82 100644
--- a/src/Http/Controller/RecordController.php
+++ b/src/Http/Controller/RecordController.php
@@ -64,6 +64,7 @@ class RecordController extends Controller
$graphArray = null;
$graph = $this->query
->filter($arguments)
+ ->notLinked($request->input("notlinked") ?? "")
->limit($limit)
->status(explode(",", $arguments["status_in"]))
->skip($skip)
diff --git a/src/Query/Query.php b/src/Query/Query.php
index 3d8a941..ff556e7 100644
--- a/src/Query/Query.php
+++ b/src/Query/Query.php
@@ -115,7 +115,6 @@ final class Query
})->sortBy("rank")->values()->toArray();
-
return new Graph(
new Collection($queryRecords),
new Collection($queryEdges),
@@ -145,19 +144,35 @@ final class Query
{
$query = DB::table("records");
$query = $this->parseFilters($query);
+ $query = $this->findNotLinked($query);
if ($this->options->limit > 0) {
$query->limit($this->options->limit);
$query->offset($this->options->skip);
}
$query = $this->orderByQuery($query);
-
return $query->get()->map(function ($r) {
$r->isRoot = true;
return $r;
})->toArray();
}
+
+ private function findNotLinked(Builder $query): Builder
+ {
+ if(empty($this->options->notLinked)){
+ return $query;
+ }
+
+ // This returns only records that have no parents
+ $query
+ ->select("records.*")
+ ->join('edges', 'records.id', '=', 'edges.target', 'left outer')
+ ->whereNull("edges.target")
+ ;
+ return $query;
+ }
+
private
function getChildren(array $ids): array
{
@@ -256,4 +271,10 @@ final class Query
}
return $query;
}
+
+ public function notLinked(string $value): Query
+ {
+ $this->options->notLinked = $value;
+ return $this;
+ }
}
diff --git a/src/Query/QueryOptions.php b/src/Query/QueryOptions.php
index 4c03aa0..ced5a8c 100644
--- a/src/Query/QueryOptions.php
+++ b/src/Query/QueryOptions.php
@@ -16,7 +16,8 @@ final class QueryOptions
public array $childrenFields = [],
public array $parentFields = [],
public array $sort = [],
- public array $status = ["published", "draft"]
+ public array $status = ["published", "draft"],
+ public string $notLinked = ""
)
{