diff --git a/app/src/displays/related-values/index.ts b/app/src/displays/related-values/index.ts index bf96829d06..e047eab946 100644 --- a/app/src/displays/related-values/index.ts +++ b/app/src/displays/related-values/index.ts @@ -1,7 +1,6 @@ import { defineDisplay } from '@directus/shared/utils'; import adjustFieldsForDisplays from '@/utils/adjust-fields-for-displays'; import { getFieldsFromTemplate } from '@directus/shared/utils'; -import { ExtensionsOptionsContext } from '@directus/shared/types'; import getRelatedCollection from '@/utils/get-related-collection'; import DisplayRelatedValues from './related-values.vue'; import { useFieldsStore } from '@/stores'; @@ -16,7 +15,7 @@ export default defineDisplay({ description: '$t:displays.related-values.description', icon: 'settings_ethernet', component: DisplayRelatedValues, - options: ({ relations }: ExtensionsOptionsContext) => { + options: ({ relations }) => { const relatedCollection = relations.o2m?.collection ?? relations.m2o?.related_collection; return [ diff --git a/app/src/displays/translations/index.ts b/app/src/displays/translations/index.ts index cf94f90366..163880cf97 100644 --- a/app/src/displays/translations/index.ts +++ b/app/src/displays/translations/index.ts @@ -3,7 +3,6 @@ import adjustFieldsForDisplays from '@/utils/adjust-fields-for-displays'; import { getFieldsFromTemplate } from '@directus/shared/utils'; import DisplayTranslations from './translations.vue'; import { useFieldsStore, useRelationsStore } from '@/stores'; -import { ExtensionsOptionsContext } from '@directus/shared/types'; type Options = { template: string; @@ -16,7 +15,7 @@ export default defineDisplay({ description: '$t:displays.translations.description', icon: 'translate', component: DisplayTranslations, - options: ({ relations }: ExtensionsOptionsContext) => { + options: ({ relations }) => { const fieldsStore = useFieldsStore(); const junctionCollection = relations.o2m?.collection; diff --git a/app/src/interfaces/_system/system-interface-options/system-interface-options.vue b/app/src/interfaces/_system/system-interface-options/system-interface-options.vue index f146b2b117..ca2f66dc42 100644 --- a/app/src/interfaces/_system/system-interface-options/system-interface-options.vue +++ b/app/src/interfaces/_system/system-interface-options/system-interface-options.vue @@ -30,7 +30,7 @@ import { useI18n } from 'vue-i18n'; import { defineComponent, computed, inject, ref } from 'vue'; import { getInterfaces } from '@/interfaces'; -import { InterfaceConfig, DeepPartial, Field, ExtensionsOptionsContext } from '@directus/shared/types'; +import { InterfaceConfig } from '@directus/shared/types'; export default defineComponent({ props: { @@ -92,9 +92,7 @@ export default defineComponent({ let optionsObjectOrArray; if (typeof selectedInterface.value.options === 'function') { - optionsObjectOrArray = ( - selectedInterface.value.options as (x: ExtensionsOptionsContext) => DeepPartial[] - )({ + optionsObjectOrArray = selectedInterface.value.options({ field: { type: 'unknown', }, diff --git a/app/src/interfaces/files/index.ts b/app/src/interfaces/files/index.ts index 723243e383..279d0cccce 100644 --- a/app/src/interfaces/files/index.ts +++ b/app/src/interfaces/files/index.ts @@ -1,7 +1,6 @@ import { defineInterface } from '@directus/shared/utils'; import InterfaceFiles from './files.vue'; import PreviewSVG from './preview.svg?raw'; -import { ExtensionsOptionsContext } from '@directus/shared/types'; export default defineInterface({ id: 'files', @@ -13,7 +12,7 @@ export default defineInterface({ types: ['alias'], localTypes: ['files'], group: 'relational', - options: ({ relations }: ExtensionsOptionsContext) => { + options: ({ relations }) => { return [ { field: 'folder', diff --git a/app/src/interfaces/input-code/index.ts b/app/src/interfaces/input-code/index.ts index a769024b56..c4faf288d6 100644 --- a/app/src/interfaces/input-code/index.ts +++ b/app/src/interfaces/input-code/index.ts @@ -1,4 +1,4 @@ -import { ExtensionsOptionsContext } from '@directus/shared/types'; +import { DeepPartial, Field } from '@directus/shared/types'; import { defineInterface } from '@directus/shared/utils'; import CodeMirror from 'codemirror'; import 'codemirror/mode/meta'; @@ -38,8 +38,8 @@ export default defineInterface({ types: ['string', 'json', 'text', 'geometry'], group: 'standard', preview: PreviewSVG, - options: ({ field }: ExtensionsOptionsContext) => { - const sharedOptions = [ + options: ({ field }) => { + const sharedOptions: DeepPartial[] = [ { field: 'lineNumber', name: '$t:interfaces.input-code.line_number', @@ -69,7 +69,7 @@ export default defineInterface({ }, ]; - const defaultOptions = [ + const defaultOptions: DeepPartial[] = [ { field: 'language', name: '$t:language', @@ -83,7 +83,7 @@ export default defineInterface({ ...sharedOptions, ]; - const jsonOptions = [...sharedOptions]; + const jsonOptions: DeepPartial[] = [...sharedOptions]; if (field?.type === 'json') { return jsonOptions; diff --git a/app/src/interfaces/input/index.ts b/app/src/interfaces/input/index.ts index 27cc296f6d..16662881b0 100644 --- a/app/src/interfaces/input/index.ts +++ b/app/src/interfaces/input/index.ts @@ -1,4 +1,4 @@ -import { ExtensionsOptionsContext } from '@directus/shared/types'; +import { DeepPartial, Field } from '@directus/shared/types'; import { defineInterface } from '@directus/shared/utils'; import InterfaceInput from './input.vue'; import PreviewSVG from './preview.svg?raw'; @@ -11,8 +11,8 @@ export default defineInterface({ component: InterfaceInput, types: ['string', 'uuid', 'bigInteger', 'integer', 'float', 'decimal', 'text'], group: 'standard', - options: ({ field }: ExtensionsOptionsContext) => { - const textOptions = { + options: ({ field }) => { + const textOptions: { standard: DeepPartial[]; advanced: DeepPartial[] } = { standard: [ { field: 'placeholder', @@ -127,7 +127,7 @@ export default defineInterface({ ], }; - const numberOptions = [ + const numberOptions: DeepPartial[] = [ { field: 'min', name: '$t:interfaces.input.minimum_value', diff --git a/app/src/interfaces/list-m2m/index.ts b/app/src/interfaces/list-m2m/index.ts index a5702316e2..0775dc59c1 100644 --- a/app/src/interfaces/list-m2m/index.ts +++ b/app/src/interfaces/list-m2m/index.ts @@ -1,7 +1,6 @@ import { defineInterface } from '@directus/shared/utils'; import InterfaceListM2M from './list-m2m.vue'; import PreviewSVG from './preview.svg?raw'; -import { ExtensionsOptionsContext } from '@directus/shared/types'; export default defineInterface({ id: 'list-m2m', @@ -13,7 +12,7 @@ export default defineInterface({ types: ['alias'], localTypes: ['m2m'], group: 'relational', - options: ({ relations }: ExtensionsOptionsContext) => { + options: ({ relations }) => { return [ { field: 'template', diff --git a/app/src/interfaces/list-o2m-tree-view/index.ts b/app/src/interfaces/list-o2m-tree-view/index.ts index 074482ffdf..ffae1c3aaf 100644 --- a/app/src/interfaces/list-o2m-tree-view/index.ts +++ b/app/src/interfaces/list-o2m-tree-view/index.ts @@ -1,6 +1,5 @@ import { defineInterface } from '@directus/shared/utils'; import InterfaceListO2MTreeView from './list-o2m-tree-view.vue'; -import { ExtensionsOptionsContext } from '@directus/shared/types'; export default defineInterface({ id: 'list-o2m-tree-view', @@ -12,7 +11,7 @@ export default defineInterface({ group: 'relational', relational: true, component: InterfaceListO2MTreeView, - options: ({ relations }: ExtensionsOptionsContext) => { + options: ({ relations }) => { const collection = relations.o2m?.collection; return [ diff --git a/app/src/interfaces/list-o2m/index.ts b/app/src/interfaces/list-o2m/index.ts index 864ee3b53f..eb7088f88f 100644 --- a/app/src/interfaces/list-o2m/index.ts +++ b/app/src/interfaces/list-o2m/index.ts @@ -1,7 +1,6 @@ import { defineInterface } from '@directus/shared/utils'; import InterfaceListO2M from './list-o2m.vue'; import PreviewSVG from './preview.svg?raw'; -import { ExtensionsOptionsContext } from '@directus/shared/types'; export default defineInterface({ id: 'list-o2m', @@ -13,7 +12,7 @@ export default defineInterface({ localTypes: ['o2m'], group: 'relational', relational: true, - options: ({ relations }: ExtensionsOptionsContext) => { + options: ({ relations }) => { const collection = relations.o2m?.collection; return [ diff --git a/app/src/interfaces/presentation-links/index.ts b/app/src/interfaces/presentation-links/index.ts index fa081b2bec..738bda12bd 100644 --- a/app/src/interfaces/presentation-links/index.ts +++ b/app/src/interfaces/presentation-links/index.ts @@ -1,6 +1,5 @@ import { defineInterface } from '@directus/shared/utils'; import InterfacePresentationLinks from './presentation-links.vue'; -import { ExtensionsOptionsContext } from '@directus/shared/types'; export default defineInterface({ id: 'presentation-links', @@ -13,7 +12,7 @@ export default defineInterface({ types: ['alias'], localTypes: ['presentation'], group: 'presentation', - options: ({ collection }: ExtensionsOptionsContext) => [ + options: ({ collection }) => [ { field: 'links', name: '$t:interfaces.presentation-links.links', diff --git a/app/src/interfaces/select-dropdown-m2o/index.ts b/app/src/interfaces/select-dropdown-m2o/index.ts index 8f4afbfbff..fdfcee1450 100644 --- a/app/src/interfaces/select-dropdown-m2o/index.ts +++ b/app/src/interfaces/select-dropdown-m2o/index.ts @@ -1,7 +1,6 @@ import { defineInterface } from '@directus/shared/utils'; import InterfaceSelectDropdownM2O from './select-dropdown-m2o.vue'; import PreviewSVG from './preview.svg?raw'; -import { ExtensionsOptionsContext } from '@directus/shared/types'; export default defineInterface({ id: 'select-dropdown-m2o', @@ -13,7 +12,7 @@ export default defineInterface({ relational: true, localTypes: ['m2o'], group: 'relational', - options: ({ relations }: ExtensionsOptionsContext) => { + options: ({ relations }) => { const collection = relations.m2o?.related_collection; return [ diff --git a/app/src/interfaces/translations/index.ts b/app/src/interfaces/translations/index.ts index 796680a327..279bb7b11b 100644 --- a/app/src/interfaces/translations/index.ts +++ b/app/src/interfaces/translations/index.ts @@ -1,6 +1,5 @@ import { defineInterface } from '@directus/shared/utils'; import InterfaceTranslations from './translations.vue'; -import { ExtensionsOptionsContext } from '@directus/shared/types'; import { useFieldsStore } from '@/stores'; export default defineInterface({ @@ -12,7 +11,7 @@ export default defineInterface({ group: 'relational', relational: true, component: InterfaceTranslations, - options: ({ relations }: ExtensionsOptionsContext) => { + options: ({ relations }) => { const fieldsStore = useFieldsStore(); const languagesCollection = relations.m2o?.related_collection; diff --git a/packages/shared/src/types/extensions.ts b/packages/shared/src/types/extensions.ts index 35992c051d..584112776a 100644 --- a/packages/shared/src/types/extensions.ts +++ b/packages/shared/src/types/extensions.ts @@ -71,7 +71,7 @@ export type ApiExtensionContext = { getSchema: (options?: { accountability?: Accountability; database?: Knex }) => Promise>; }; -export type ExtensionsOptionsContext = { +export type ExtensionOptionsContext = { collection: string; editing: string; field: DeepPartial; diff --git a/packages/shared/src/types/interfaces.ts b/packages/shared/src/types/interfaces.ts index 690b1317e7..ba6c246c2f 100644 --- a/packages/shared/src/types/interfaces.ts +++ b/packages/shared/src/types/interfaces.ts @@ -1,7 +1,7 @@ import { Field, LocalType, Type } from './fields'; -import { Component } from 'vue'; +import { Component, ComponentOptions } from 'vue'; import { DeepPartial } from './misc'; -import { ExtensionsOptionsContext } from '.'; +import { ExtensionOptionsContext } from './extensions'; export interface InterfaceConfig { id: string; @@ -12,10 +12,11 @@ export interface InterfaceConfig { component: Component; options: | DeepPartial[] - | ((ctx: ExtensionsOptionsContext) => DeepPartial[]) | { standard: DeepPartial[]; advanced: DeepPartial[] } - | ((ctx: ExtensionsOptionsContext) => { standard: DeepPartial[]; advanced: DeepPartial[] }) - | Component + | (( + ctx: ExtensionOptionsContext + ) => DeepPartial[] | { standard: DeepPartial[]; advanced: DeepPartial[] }) + | ComponentOptions | null; types: readonly Type[]; localTypes?: readonly LocalType[];