From c54f525277440d80ce0d318f3da186ce46560c5f Mon Sep 17 00:00:00 2001 From: Nitwel Date: Fri, 11 Sep 2020 18:12:24 +0200 Subject: [PATCH 01/15] suggest fields on m2o --- .../v-field-template/field-list-item.vue | 5 +- .../v-field-template/v-field-template.vue | 6 +- app/src/interfaces/many-to-one/index.ts | 13 +---- app/src/interfaces/many-to-one/options.vue | 56 +++++++++++++++++++ 4 files changed, 67 insertions(+), 13 deletions(-) create mode 100644 app/src/interfaces/many-to-one/options.vue diff --git a/app/src/components/v-field-template/field-list-item.vue b/app/src/components/v-field-template/field-list-item.vue index ca48b7cdb4..6224403790 100644 --- a/app/src/components/v-field-template/field-list-item.vue +++ b/app/src/components/v-field-template/field-list-item.vue @@ -1,6 +1,6 @@ - + @@ -49,6 +49,10 @@ export default defineComponent({ type: String, required: true, }, + depth: { + type: Number, + default: 10, + }, }, setup(props, { emit }) { const fieldsStore = useFieldsStore(); diff --git a/app/src/interfaces/many-to-one/index.ts b/app/src/interfaces/many-to-one/index.ts index b0a41bd7a3..addb0eac52 100644 --- a/app/src/interfaces/many-to-one/index.ts +++ b/app/src/interfaces/many-to-one/index.ts @@ -1,5 +1,6 @@ import { defineInterface } from '../define'; import InterfaceManyToOne from './many-to-one.vue'; +import Options from './options.vue'; export default defineInterface(({ i18n }) => ({ id: 'many-to-one', @@ -9,16 +10,6 @@ export default defineInterface(({ i18n }) => ({ component: InterfaceManyToOne, types: ['uuid', 'string', 'text', 'integer', 'bigInteger'], relationship: 'm2o', - options: [ - { - field: 'template', - name: i18n.t('interfaces.many-to-one.display_template'), - type: 'string', - meta: { - width: 'half', - interface: 'text-input', - }, - }, - ], + options: Options, recommendedDisplays: ['related-values'], })); diff --git a/app/src/interfaces/many-to-one/options.vue b/app/src/interfaces/many-to-one/options.vue new file mode 100644 index 0000000000..589fcef8b0 --- /dev/null +++ b/app/src/interfaces/many-to-one/options.vue @@ -0,0 +1,56 @@ + + + + + From 9078947d2037d3840e6d5942bdc3eb58287db078 Mon Sep 17 00:00:00 2001 From: Nitwel Date: Fri, 11 Sep 2020 18:34:01 +0200 Subject: [PATCH 02/15] add missing depth downpass --- app/src/components/v-field-template/field-list-item.vue | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/components/v-field-template/field-list-item.vue b/app/src/components/v-field-template/field-list-item.vue index 6224403790..4d3c6a67aa 100644 --- a/app/src/components/v-field-template/field-list-item.vue +++ b/app/src/components/v-field-template/field-list-item.vue @@ -12,6 +12,7 @@ :key="childField.field" :parent="`${parent ? parent + '.' : ''}${field.field}`" :field="childField" + :depth="depth - 1" @add="$emit('add', $event)" /> @@ -34,6 +35,7 @@ export default defineComponent({ }, depth: { type: Number, + default: 10, }, }, }); From a54e8f10e6ebef8babc845cb05f9dcddf2de911c Mon Sep 17 00:00:00 2001 From: Nitwel Date: Fri, 11 Sep 2020 19:10:38 +0200 Subject: [PATCH 03/15] change to imported styles --- app/src/interfaces/many-to-one/options.vue | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/app/src/interfaces/many-to-one/options.vue b/app/src/interfaces/many-to-one/options.vue index 589fcef8b0..95d93eae8e 100644 --- a/app/src/interfaces/many-to-one/options.vue +++ b/app/src/interfaces/many-to-one/options.vue @@ -1,10 +1,12 @@ @@ -50,7 +52,9 @@ export default defineComponent({ From 4a4f79b0b6238d5be335beda8d16929193022bc4 Mon Sep 17 00:00:00 2001 From: Nitwel Date: Fri, 18 Sep 2020 10:58:02 +0200 Subject: [PATCH 04/15] fix depth options and clean code --- .../v-field-template/field-list-item.vue | 4 ++-- .../v-field-template/v-field-template.vue | 2 +- app/src/interfaces/many-to-one/options.vue | 14 ++++++++------ app/src/lang/en-US/interfaces.json | 3 ++- app/src/stores/relations.ts | 2 +- 5 files changed, 14 insertions(+), 11 deletions(-) diff --git a/app/src/components/v-field-template/field-list-item.vue b/app/src/components/v-field-template/field-list-item.vue index 4d3c6a67aa..5e9d3aa5c5 100644 --- a/app/src/components/v-field-template/field-list-item.vue +++ b/app/src/components/v-field-template/field-list-item.vue @@ -1,6 +1,6 @@ @@ -14,6 +14,7 @@ import { Field } from '@/types'; import { defineComponent, PropType, computed } from '@vue/composition-api'; import { useRelationsStore } from '@/stores/'; +import { Relation } from '@/types/relations'; export default defineComponent({ props: { fieldData: { @@ -39,12 +40,13 @@ export default defineComponent({ }, }); const collection = computed(() => { - if (props.fieldData.field == null || props.fieldData.meta?.collection == null) return null; - const relationData = relationsStore.getRelationsForField( - props.fieldData.meta.collection, + if (props.fieldData.field === null || props.fieldData.meta?.collection === null) return null; + const relationData: Relation[] = relationsStore.getRelationsForField( + props.fieldData.meta?.collection, props.fieldData.field - )?.[0]; - return relationData.one_collection; + ); + + return relationData[0]?.one_collection; }); return { template, collection }; }, diff --git a/app/src/lang/en-US/interfaces.json b/app/src/lang/en-US/interfaces.json index 5db43a7f0d..df6183ea09 100644 --- a/app/src/lang/en-US/interfaces.json +++ b/app/src/lang/en-US/interfaces.json @@ -131,7 +131,8 @@ "one-to-many": { "one-to-many": "One to Many", "description": "Select multiple related items", - "readable_fields_copy": "Select the fields that the user can view" + "readable_fields_copy": "Select the fields that the user can view", + "no_collection": "No matching relation could be found" }, "radio-buttons": { "radio-buttons": "Radio Buttons", diff --git a/app/src/stores/relations.ts b/app/src/stores/relations.ts index 166dd2253f..c253e8d746 100644 --- a/app/src/stores/relations.ts +++ b/app/src/stores/relations.ts @@ -52,7 +52,7 @@ export const useRelationsStore = createStore({ ] as Relation[]; } - const relations = this.getRelationsForCollection(collection).filter((relation: Relation) => { + const relations: Relation[] = this.getRelationsForCollection(collection).filter((relation: Relation) => { return relation.many_field === field || relation.one_field === field; }); From b93025858c485ccdd8db3fbb327503a39c67831e Mon Sep 17 00:00:00 2001 From: Nitwel Date: Fri, 18 Sep 2020 11:06:35 +0200 Subject: [PATCH 05/15] fix collection not null --- app/src/interfaces/many-to-one/options.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/interfaces/many-to-one/options.vue b/app/src/interfaces/many-to-one/options.vue index 317498aa96..6da15a6f75 100644 --- a/app/src/interfaces/many-to-one/options.vue +++ b/app/src/interfaces/many-to-one/options.vue @@ -40,7 +40,7 @@ export default defineComponent({ }, }); const collection = computed(() => { - if (props.fieldData.field === null || props.fieldData.meta?.collection === null) return null; + if (props.fieldData.field === null || props.fieldData.meta?.collection === undefined) return null; const relationData: Relation[] = relationsStore.getRelationsForField( props.fieldData.meta?.collection, props.fieldData.field From 8fcd65de430abf83ff873f78c19bb191ae3a4772 Mon Sep 17 00:00:00 2001 From: Nitwel Date: Fri, 11 Sep 2020 14:18:05 +0200 Subject: [PATCH 06/15] add v-field-select --- app/src/components/register.ts | 2 + .../v-field-select/field-list-item.vue | 37 +++++ app/src/components/v-field-select/index.ts | 4 + app/src/components/v-field-select/readme.md | 1 + app/src/components/v-field-select/types.ts | 7 + .../v-field-select/v-field-select.vue | 138 ++++++++++++++++++ app/src/layouts/tabular/tabular.vue | 7 + 7 files changed, 196 insertions(+) create mode 100644 app/src/components/v-field-select/field-list-item.vue create mode 100644 app/src/components/v-field-select/index.ts create mode 100644 app/src/components/v-field-select/readme.md create mode 100644 app/src/components/v-field-select/types.ts create mode 100644 app/src/components/v-field-select/v-field-select.vue diff --git a/app/src/components/register.ts b/app/src/components/register.ts index b0ddc02027..791834dcaa 100644 --- a/app/src/components/register.ts +++ b/app/src/components/register.ts @@ -13,6 +13,7 @@ import VDivider from './v-divider'; import VError from './v-error'; import VFancySelect from './v-fancy-select'; import VFieldTemplate from './v-field-template'; +import VFieldSelect from './v-field-select'; import VForm from './v-form'; import VHover from './v-hover/'; import VIcon from './v-icon/'; @@ -64,6 +65,7 @@ Vue.component('v-divider', VDivider); Vue.component('v-error', VError); Vue.component('v-fancy-select', VFancySelect); Vue.component('v-field-template', VFieldTemplate); +Vue.component('v-field-select', VFieldSelect); Vue.component('v-form', VForm); Vue.component('v-hover', VHover); Vue.component('v-icon', VIcon); diff --git a/app/src/components/v-field-select/field-list-item.vue b/app/src/components/v-field-select/field-list-item.vue new file mode 100644 index 0000000000..ca48b7cdb4 --- /dev/null +++ b/app/src/components/v-field-select/field-list-item.vue @@ -0,0 +1,37 @@ + + + diff --git a/app/src/components/v-field-select/index.ts b/app/src/components/v-field-select/index.ts new file mode 100644 index 0000000000..b1c710c945 --- /dev/null +++ b/app/src/components/v-field-select/index.ts @@ -0,0 +1,4 @@ +import VFieldSelect from './v-field-select.vue'; + +export default VFieldSelect; +export { VFieldSelect }; diff --git a/app/src/components/v-field-select/readme.md b/app/src/components/v-field-select/readme.md new file mode 100644 index 0000000000..0797026f8a --- /dev/null +++ b/app/src/components/v-field-select/readme.md @@ -0,0 +1 @@ +# Field Select diff --git a/app/src/components/v-field-select/types.ts b/app/src/components/v-field-select/types.ts new file mode 100644 index 0000000000..017198e912 --- /dev/null +++ b/app/src/components/v-field-select/types.ts @@ -0,0 +1,7 @@ +import { TranslateResult } from 'vue-i18n'; + +export type FieldTree = { + field: string; + name: string | TranslateResult; + children?: FieldTree[]; +}; diff --git a/app/src/components/v-field-select/v-field-select.vue b/app/src/components/v-field-select/v-field-select.vue new file mode 100644 index 0000000000..3135187a4a --- /dev/null +++ b/app/src/components/v-field-select/v-field-select.vue @@ -0,0 +1,138 @@ + + + + + diff --git a/app/src/layouts/tabular/tabular.vue b/app/src/layouts/tabular/tabular.vue index 939b05d6ae..c7883a33c5 100644 --- a/app/src/layouts/tabular/tabular.vue +++ b/app/src/layouts/tabular/tabular.vue @@ -1,6 +1,11 @@