diff --git a/app/src/composables/use-permissions.ts b/app/src/composables/use-permissions.ts index 1897b5689c..2f55565d34 100644 --- a/app/src/composables/use-permissions.ts +++ b/app/src/composables/use-permissions.ts @@ -54,9 +54,9 @@ export function usePermissions(collection: Ref, item: Ref, isNew: R if (!permissions) return fields; - if (permissions?.fields?.includes('*') === false) { + if (permissions.fields?.includes('*') === false) { fields = fields.map((field: Field) => { - if (permissions.fields.includes(field.field) === false) { + if (permissions.fields?.includes(field.field) === false) { field.meta = { ...(field.meta || {}), readonly: true, @@ -67,12 +67,12 @@ export function usePermissions(collection: Ref, item: Ref, isNew: R }); } - if (permissions?.presets) { + if (permissions.presets) { fields = fields.map((field: Field) => { - if (field.field in permissions.presets) { + if (field.field in permissions.presets!) { field.schema = { ...(field.schema || {}), - default_value: permissions.presets[field.field], + default_value: permissions.presets![field.field], } as any; } diff --git a/app/src/displays/translations/index.ts b/app/src/displays/translations/index.ts index 163880cf97..ae8b0bcf80 100644 --- a/app/src/displays/translations/index.ts +++ b/app/src/displays/translations/index.ts @@ -103,7 +103,7 @@ export default defineDisplay({ fields.push(translationsPrimaryKeyField.field); } - if (languagesRelation?.field && !fields.includes(languagesRelation.field)) { + if (languagesRelation && languagesPrimaryKeyField && !fields.includes(languagesRelation.field)) { fields.push(`${languagesRelation.field}.${languagesPrimaryKeyField.field}`); if (options?.languageField) { diff --git a/app/src/layouts/map/index.ts b/app/src/layouts/map/index.ts index a9b727b806..635b407664 100644 --- a/app/src/layouts/map/index.ts +++ b/app/src/layouts/map/index.ts @@ -11,7 +11,7 @@ import { layers as directusLayers } from './style'; import { useRouter } from 'vue-router'; import { useSync } from '@directus/shared/composables'; import { LayoutOptions, LayoutQuery } from './types'; -import { Filter } from '@directus/shared/types'; +import { Filter, Item } from '@directus/shared/types'; import { useCollection } from '@directus/shared/composables'; import { useItems } from '@directus/shared/composables'; import { getFieldsFromTemplate } from '@directus/shared/utils'; @@ -225,20 +225,20 @@ export default defineLayout({ }); } - function setSelection(ids: Array) { - selection.value = ids; + function setSelection(ids: Item[]) { + selection.value = Array.from(new Set(ids)); } - function pushSelection(ids: Array) { + function pushSelection(ids: Item[]) { selection.value = Array.from(new Set(selection.value.concat(ids))); } - function handleSelect({ ids, replace }: { ids: Array; replace: boolean }) { + function handleSelect({ ids, replace }: { ids: Item[]; replace: boolean }) { if (replace) setSelection(ids); else pushSelection(ids); } - function handleClick({ id, replace }: { id: string | number; replace: boolean }) { + function handleClick({ id, replace }: { id: Item; replace: boolean }) { if (props.selectMode) { handleSelect({ ids: [id], replace }); } else { diff --git a/app/src/stores/fields.ts b/app/src/stores/fields.ts index baebcffc5f..c5d88b5cd5 100644 --- a/app/src/stores/fields.ts +++ b/app/src/stores/fields.ts @@ -283,6 +283,9 @@ export const useFieldsStore = defineStore({ if (relation === undefined) return false; const relatedCollection = relation.field === field ? relation.related_collection : relation.collection; + + if (relatedCollection === null) return false; + const relatedField = path.join('.'); return this.getField(relatedCollection, relatedField); }, diff --git a/app/src/utils/add-related-primary-key-to-fields.ts b/app/src/utils/add-related-primary-key-to-fields.ts index 631b46b328..7cb6b13414 100644 --- a/app/src/utils/add-related-primary-key-to-fields.ts +++ b/app/src/utils/add-related-primary-key-to-fields.ts @@ -28,9 +28,9 @@ export function addRelatedPrimaryKeyToFields(currentCollection: string, fields: const field = fieldsStore.getField(currentCollection, fieldName); const primaryKeyField = fieldsStore.getPrimaryKeyFieldForCollection(field?.collection ?? ''); - const includeField = fieldParts.slice(0, -1).concat(primaryKeyField.field).join('.'); + const includeField = primaryKeyField && fieldParts.slice(0, -1).concat(primaryKeyField.field).join('.'); - if (!sanitizedFields.includes(includeField)) { + if (includeField && !sanitizedFields.includes(includeField)) { sanitizedFields.push(includeField); } } diff --git a/app/src/utils/get-setting.ts b/app/src/utils/get-setting.ts index 12279cca65..303f413b06 100644 --- a/app/src/utils/get-setting.ts +++ b/app/src/utils/get-setting.ts @@ -1,7 +1,8 @@ import { useSettingsStore } from '@/stores'; +import { Settings } from '@directus/shared/types'; -export default function getSetting(setting: string): any { +export default function getSetting(setting: keyof Settings): any { const settingsStore = useSettingsStore(); - if (settingsStore.settings && setting in settingsStore.settings) return settingsStore.settings[setting]; + if (settingsStore.settings) return settingsStore.settings[setting]; return null; }