diff --git a/app/src/components/v-field-select/v-field-select.vue b/app/src/components/v-field-select/v-field-select.vue
index c794009767..aa36c44b2d 100644
--- a/app/src/components/v-field-select/v-field-select.vue
+++ b/app/src/components/v-field-select/v-field-select.vue
@@ -42,7 +42,7 @@ import FieldListItem from '../v-field-template/field-list-item.vue';
import { useFieldsStore } from '@/stores';
import { Field } from '@/types/';
import Draggable from 'vuedraggable';
-import useFieldTree from '@/composables/use-field-tree';
+import useFieldTree, { findTree, filterTree } from '@/composables/use-field-tree';
import useCollection from '@/composables/use-collection';
import { FieldTree } from '../v-field-template/types';
import hideDragImage from '@/utils/hide-drag-image';
@@ -103,36 +103,6 @@ export default defineComponent({
return { menuActive, addField, removeField, selectableFields, selectedFields, hideDragImage, tree };
- function findTree(tree: FieldTree[] | undefined, fieldSections: string[]): FieldTree | undefined {
- if (tree === undefined) return undefined;
-
- const fieldObject = tree.find((f) => f.field === fieldSections[0]);
-
- if (fieldObject === undefined) return undefined;
- if (fieldSections.length === 1) return fieldObject;
- return findTree(fieldObject.children, fieldSections.slice(1));
- }
-
- function filterTree(
- tree: FieldTree[] | undefined,
- f: (field: FieldTree, prefix: string) => boolean,
- prefix = ''
- ) {
- if (tree === undefined) return undefined;
-
- const newTree: FieldTree[] = [];
- tree.forEach((field) => {
- if (f(field, prefix)) {
- newTree.push({
- field: field.field,
- name: field.name,
- children: filterTree(field.children, f, prefix + field.field + '.'),
- });
- }
- });
- return newTree.length === 0 ? undefined : newTree;
- }
-
function removeField(field: string) {
_value.value = _value.value.filter((f) => f !== field);
}
diff --git a/app/src/components/v-field-template/v-field-template.vue b/app/src/components/v-field-template/v-field-template.vue
index 14682da64a..9735850727 100644
--- a/app/src/components/v-field-template/v-field-template.vue
+++ b/app/src/components/v-field-template/v-field-template.vue
@@ -32,7 +32,7 @@ import { defineComponent, toRefs, ref, watch, onMounted, onUnmounted } from '@vu
import FieldListItem from './field-list-item.vue';
import { useFieldsStore } from '@/stores';
import { Field } from '@/types/';
-import useFieldTree from '@/composables/use-field-tree';
+import useFieldTree, { findTree } from '@/composables/use-field-tree';
export default defineComponent({
components: { FieldListItem },
@@ -152,8 +152,10 @@ export default defineComponent({
}
function addField(fieldKey: string) {
+ console.log(fieldKey);
+
if (!contentEl.value) return;
- const field: Field | null = fieldsStore.getField(props.collection, fieldKey);
+ const field = findTree(tree.value, fieldKey.split('.'));
if (!field) return;
const button = document.createElement('button');
@@ -161,6 +163,12 @@ export default defineComponent({
button.setAttribute('contenteditable', 'false');
button.innerText = String(field.name);
+ if (window.getSelection()?.rangeCount == 0) {
+ const range = document.createRange();
+ range.selectNodeContents(contentEl.value.children[0]);
+ window.getSelection()?.addRange(range);
+ }
+
const range = window.getSelection()?.getRangeAt(0);
if (!range) return;
range.deleteContents();
@@ -245,7 +253,7 @@ export default defineComponent({
return `${part}`;
}
const fieldKey = part.replaceAll(/({|})/g, '').trim();
- const field: Field | null = fieldsStore.getField(props.collection, fieldKey);
+ const field = findTree(tree.value, fieldKey.split('.'));
if (!field) return '';
diff --git a/app/src/composables/use-field-tree/index.ts b/app/src/composables/use-field-tree/index.ts
index 1f1c1de159..7b57a783a2 100644
--- a/app/src/composables/use-field-tree/index.ts
+++ b/app/src/composables/use-field-tree/index.ts
@@ -1,4 +1,4 @@
-import useFieldTree from './use-field-tree';
+import useFieldTree, { filterTree, findTree } from './use-field-tree';
export default useFieldTree;
-export { useFieldTree };
+export { useFieldTree, filterTree, findTree };
diff --git a/app/src/composables/use-field-tree/use-field-tree.ts b/app/src/composables/use-field-tree/use-field-tree.ts
index 6c6c7c79c8..d6711f1ad0 100644
--- a/app/src/composables/use-field-tree/use-field-tree.ts
+++ b/app/src/composables/use-field-tree/use-field-tree.ts
@@ -3,6 +3,36 @@ import { FieldTree } from './types';
import { useFieldsStore, useRelationsStore } from '@/stores/';
import { Field, Relation } from '@/types';
+export function findTree(tree: FieldTree[] | undefined, fieldSections: string[]): FieldTree | undefined {
+ if (tree === undefined) return undefined;
+
+ const fieldObject = tree.find((f) => f.field === fieldSections[0]);
+
+ if (fieldObject === undefined) return undefined;
+ if (fieldSections.length === 1) return fieldObject;
+ return findTree(fieldObject.children, fieldSections.slice(1));
+}
+
+export function filterTree(
+ tree: FieldTree[] | undefined,
+ f: (field: FieldTree, prefix: string) => boolean,
+ prefix = ''
+) {
+ if (tree === undefined) return undefined;
+
+ const newTree: FieldTree[] = [];
+ tree.forEach((field) => {
+ if (f(field, prefix)) {
+ newTree.push({
+ field: field.field,
+ name: field.name,
+ children: filterTree(field.children, f, prefix + field.field + '.'),
+ });
+ }
+ });
+ return newTree.length === 0 ? undefined : newTree;
+}
+
export default function useFieldTree(collection: Ref, showHidden = false) {
const fieldsStore = useFieldsStore();
const relationsStore = useRelationsStore();
diff --git a/app/src/interfaces/many-to-one/options.vue b/app/src/interfaces/many-to-one/options.vue
index 6da15a6f75..5492673025 100644
--- a/app/src/interfaces/many-to-one/options.vue
+++ b/app/src/interfaces/many-to-one/options.vue
@@ -40,13 +40,13 @@ export default defineComponent({
},
});
const collection = computed(() => {
- if (props.fieldData.field === null || props.fieldData.meta?.collection === undefined) return null;
- const relationData: Relation[] = relationsStore.getRelationsForField(
- props.fieldData.meta?.collection,
- props.fieldData.field
- );
+ const collection = props.fieldData.meta?.collection;
+ const field = props.fieldData.field;
- return relationData[0]?.one_collection;
+ if (collection === null || field === undefined) return null;
+ const relationData: Relation[] = relationsStore.getRelationsForField(collection, field);
+
+ return relationData.find((r) => r.many_collection === collection && r.many_field === field)?.one_collection;
});
return { template, collection };
},