diff --git a/app/src/displays/related-values/index.ts b/app/src/displays/related-values/index.ts index 4069171604..0f7a74a589 100644 --- a/app/src/displays/related-values/index.ts +++ b/app/src/displays/related-values/index.ts @@ -5,6 +5,7 @@ import adjustFieldsForDisplays from '@/utils/adjust-fields-for-displays'; import getRelatedCollection from '@/utils/get-related-collection'; import useCollection from '@/composables/use-collection'; import { ref } from '@vue/composition-api'; +import options from './options.vue'; type Options = { template: string; @@ -16,19 +17,9 @@ export default defineDisplay(({ i18n }) => ({ description: i18n.t('displays.related-values.description'), icon: 'settings_ethernet', handler: DisplayRelatedValues, - options: [ - /** @todo make this a component so we have dynamic collection for display template component */ - { - field: 'template', - name: i18n.t('display_template'), - type: 'string', - meta: { - interface: 'text-input', - width: 'full', - }, - }, - ], + options: options, types: ['alias', 'string', 'uuid', 'integer', 'bigInteger', 'json'], + localTypes: ['m2m', 'm2o', 'o2m'], fields: (options: Options, { field, collection }) => { const relatedCollection = getRelatedCollection(collection, field); const { primaryKeyField } = useCollection(ref(relatedCollection as string)); diff --git a/app/src/displays/related-values/options.vue b/app/src/displays/related-values/options.vue new file mode 100644 index 0000000000..78d9d5e8ff --- /dev/null +++ b/app/src/displays/related-values/options.vue @@ -0,0 +1,82 @@ + + + + + diff --git a/app/src/displays/types.ts b/app/src/displays/types.ts index 91dfdd8181..d40cfa44b1 100644 --- a/app/src/displays/types.ts +++ b/app/src/displays/types.ts @@ -1,6 +1,6 @@ import VueI18n from 'vue-i18n'; import { Component } from 'vue'; -import { Field, types } from '@/types'; +import { Field, localTypes, types } from '@/types'; export type DisplayHandlerFunctionContext = { type: string; @@ -30,6 +30,7 @@ export type DisplayConfig = { handler: DisplayHandlerFunction | Component; options: null | DeepPartial[] | Component; types: readonly typeof types[number][]; + localTypes?: readonly typeof localTypes[number][]; fields?: string[] | DisplayFieldsFunction; }; diff --git a/app/src/modules/settings/routes/data-model/field-detail/components/display.vue b/app/src/modules/settings/routes/data-model/field-detail/components/display.vue index a0f3e11cbe..c593e38846 100644 --- a/app/src/modules/settings/routes/data-model/field-detail/components/display.vue +++ b/app/src/modules/settings/routes/data-model/field-detail/components/display.vue @@ -22,13 +22,22 @@ v-model="fieldData.meta.display_options" /> - + diff --git a/app/src/modules/settings/routes/data-model/field-detail/store.ts b/app/src/modules/settings/routes/data-model/field-detail/store.ts index 7cb5337023..80d73fd59f 100644 --- a/app/src/modules/settings/routes/data-model/field-detail/store.ts +++ b/app/src/modules/settings/routes/data-model/field-detail/store.ts @@ -12,7 +12,7 @@ import { getInterfaces } from '@/interfaces'; import { getDisplays } from '@/displays'; import { InterfaceConfig } from '@/interfaces/types'; import { DisplayConfig } from '@/displays/types'; -import { Field } from '@/types'; +import { Field, localTypes } from '@/types'; import Vue from 'vue'; const fieldsStore = useFieldsStore(); @@ -25,11 +25,7 @@ let availableDisplays: ComputedRef; export { state, availableInterfaces, availableDisplays, initLocalStore, clearLocalStore }; -function initLocalStore( - collection: string, - field: string, - type: 'standard' | 'file' | 'files' | 'm2o' | 'o2m' | 'm2m' | 'presentation' | 'translations' -) { +function initLocalStore(collection: string, field: string, type: typeof localTypes[number]) { const interfaces = getInterfaces(); const displays = getDisplays(); @@ -91,8 +87,8 @@ function initLocalStore( availableDisplays = computed(() => displays.value.filter((display) => { const matchesType = display.types.includes(state.fieldData?.type || 'alias'); - const matchesRelation = true; - return matchesType && matchesRelation; + let matchesLocalType = display.localTypes?.includes(type); + return matchesType && (matchesLocalType === undefined || matchesLocalType); }) ); diff --git a/app/src/types/fields.ts b/app/src/types/fields.ts index 63fd7ecfa2..95488c7bc6 100644 --- a/app/src/types/fields.ts +++ b/app/src/types/fields.ts @@ -27,6 +27,8 @@ export const types = [ 'unknown', ] as const; +export const localTypes = ['standard', 'file', 'files', 'm2o', 'o2m', 'm2m', 'presentation', 'translations'] as const; + export type FieldSchema = { /** @todo import this from knex-schema-inspector when that's launched */ name: string; @@ -70,7 +72,6 @@ export interface FieldRaw { collection: string; field: string; type: typeof types[number]; - schema: FieldSchema | null; meta: FieldMeta | null; }