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-chip/v-chip.vue b/app/src/components/v-chip/v-chip.vue index d385c9a6e7..30dbe930e8 100644 --- a/app/src/components/v-chip/v-chip.vue +++ b/app/src/components/v-chip/v-chip.vue @@ -75,8 +75,8 @@ export default defineComponent({ 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..3ebb7c5407 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,7 @@ {{ field.name }} diff --git a/app/src/components/v-field-template/types.ts b/app/src/components/v-field-template/types.ts index 017198e912..f3606450c7 100644 --- a/app/src/components/v-field-template/types.ts +++ b/app/src/components/v-field-template/types.ts @@ -1,7 +1,9 @@ +import { Field } from '@/types'; import { TranslateResult } from 'vue-i18n'; export type FieldTree = { field: string; name: string | TranslateResult; + disabled?: boolean; children?: FieldTree[]; }; 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 63c17f1fc8..b15696504c 100644 --- a/app/src/composables/use-field-tree/use-field-tree.ts +++ b/app/src/composables/use-field-tree/use-field-tree.ts @@ -3,17 +3,22 @@ import { FieldTree } from './types'; import { useFieldsStore, useRelationsStore } from '@/stores/'; import { Field, Relation } from '@/types'; -export default function useFieldTree(collection: Ref) { +export default function useFieldTree(collection: Ref, showHidden = false) { const fieldsStore = useFieldsStore(); const relationsStore = useRelationsStore(); const tree = computed(() => { return fieldsStore .getFieldsForCollection(collection.value) - .filter( - (field: Field) => - field.meta?.hidden === false && (field.meta?.special || []).includes('alias') === false - ) + .filter((field: Field) => { + let shown = (field.meta?.special || []).includes('alias') === false; + + if (showHidden === false && field.meta?.hidden === false) { + shown = false; + } + + return shown; + }) .map((field: Field) => parseField(field, [])); function parseField(field: Field, parents: Field[]) { diff --git a/app/src/interfaces/many-to-many/index.ts b/app/src/interfaces/many-to-many/index.ts index 2c9be51c25..506a5912ce 100644 --- a/app/src/interfaces/many-to-many/index.ts +++ b/app/src/interfaces/many-to-many/index.ts @@ -1,5 +1,6 @@ import { defineInterface } from '../define'; import InterfaceManyToMany from './many-to-many.vue'; +import Options from './options.vue'; export default defineInterface(({ i18n }) => ({ id: 'many-to-many', @@ -9,19 +10,6 @@ export default defineInterface(({ i18n }) => ({ component: InterfaceManyToMany, relationship: 'm2m', types: ['alias'], - options: [ - { - field: 'fields', - type: 'json', - name: i18n.tc('field', 0), - meta: { - interface: 'tags', - width: 'full', - options: { - placeholder: i18n.t('readable_fields_copy'), - }, - }, - }, - ], + options: Options, recommendedDisplays: ['related-values'], })); diff --git a/app/src/interfaces/many-to-many/options.vue b/app/src/interfaces/many-to-many/options.vue new file mode 100644 index 0000000000..ecc35fa30f --- /dev/null +++ b/app/src/interfaces/many-to-many/options.vue @@ -0,0 +1,73 @@ + + + {{ $t('interfaces.one-to-many.no_collection') }} + + + + {{ $t('select_fields') }} + + + + + + + + diff --git a/app/src/interfaces/one-to-many/index.ts b/app/src/interfaces/one-to-many/index.ts index 531321ff8a..9bb215b1e9 100644 --- a/app/src/interfaces/one-to-many/index.ts +++ b/app/src/interfaces/one-to-many/index.ts @@ -1,5 +1,6 @@ import { defineInterface } from '../define'; import InterfaceOneToMany from './one-to-many.vue'; +import Options from './options.vue'; export default defineInterface(({ i18n }) => ({ id: 'one-to-many', @@ -9,19 +10,6 @@ export default defineInterface(({ i18n }) => ({ component: InterfaceOneToMany, types: ['alias'], relationship: 'o2m', - options: [ - { - field: 'fields', - type: 'json', - name: i18n.tc('field', 0), - meta: { - interface: 'tags', - width: 'full', - options: { - placeholder: i18n.t('interfaces.one-to-many.readable_fields_copy'), - }, - }, - }, - ], + options: Options, recommendedDisplays: ['related-values'], })); diff --git a/app/src/interfaces/one-to-many/options.vue b/app/src/interfaces/one-to-many/options.vue new file mode 100644 index 0000000000..aa0ab974d5 --- /dev/null +++ b/app/src/interfaces/one-to-many/options.vue @@ -0,0 +1,72 @@ + + + {{ $t('interfaces.one-to-many.no_collection') }} + + + + {{ $t('select_fields') }} + + + + + + + + diff --git a/app/src/lang/en-US/index.json b/app/src/lang/en-US/index.json index bbe13d0df8..065da128ac 100644 --- a/app/src/lang/en-US/index.json +++ b/app/src/lang/en-US/index.json @@ -10,6 +10,8 @@ "only_show_the_file_extension": "Only show the file extension", "textarea": "Textarea", + "add_field": "Add Field", + "role_name": "Role Name", "db_only_click_to_configure": "Database Only: Click to Configure ", @@ -1036,6 +1038,8 @@ } }, + "no_fields_in_collection": "There are no fields in \"{collection}\" yet", + "do_nothing": "Do Nothing", "generate_and_save_uuid": "Generate and Save UUID", "save_current_user_id": "Save Current User ID", diff --git a/app/src/lang/en-US/interfaces.json b/app/src/lang/en-US/interfaces.json index 5db43a7f0d..4a962fef3e 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": "The collection could not be found" }, "radio-buttons": { "radio-buttons": "Radio Buttons", diff --git a/app/src/modules/settings/routes/data-model/field-detail/components/interface.vue b/app/src/modules/settings/routes/data-model/field-detail/components/interface.vue index c1da0d9529..2af73fbab3 100644 --- a/app/src/modules/settings/routes/data-model/field-detail/components/interface.vue +++ b/app/src/modules/settings/routes/data-model/field-detail/components/interface.vue @@ -24,7 +24,9 @@ @@ -33,7 +35,7 @@
{{ $t('select_fields') }}