diff --git a/api/src/constants.ts b/api/src/constants.ts index 2fec591861..56729b3210 100644 --- a/api/src/constants.ts +++ b/api/src/constants.ts @@ -40,7 +40,7 @@ export const ASSET_TRANSFORM_QUERY_KEYS = [ export const FILTER_VARIABLES = ['$NOW', '$CURRENT_USER', '$CURRENT_ROLE']; -export const ALIAS_TYPES = ['alias', 'o2m', 'm2m', 'm2a', 'files', 'files', 'translations']; +export const ALIAS_TYPES = ['alias', 'o2m', 'm2m', 'm2a', 'files', 'translations']; export const DEFAULT_AUTH_PROVIDER = 'default'; diff --git a/api/src/services/graphql.ts b/api/src/services/graphql.ts index 595c5a2e27..716c68d7f3 100644 --- a/api/src/services/graphql.ts +++ b/api/src/services/graphql.ts @@ -410,7 +410,7 @@ export class GraphQLService { acc[field.field] = { type, description: field.note, - resolve: (obj: Record, _, __, info) => { + resolve: (obj: Record) => { return obj[field.field]; }, }; diff --git a/app/src/components/v-button/v-button.vue b/app/src/components/v-button/v-button.vue index 211bf01b86..2383b13e62 100644 --- a/app/src/components/v-button/v-button.vue +++ b/app/src/components/v-button/v-button.vue @@ -200,7 +200,7 @@ export default defineComponent({ --v-button-background-color: var(--primary); --v-button-background-color-hover: var(--primary-125); --v-button-background-color-active: var(--primary); - --v-button-background-color-disabled: var(--background-normal); + --v-button-background-color-disabled: var(--background-subdued); --v-button-font-size: 16px; --v-button-font-weight: 600; --v-button-line-height: 22px; diff --git a/app/src/components/v-checkbox/v-checkbox.vue b/app/src/components/v-checkbox/v-checkbox.vue index 89c1e03e58..3d61209b3c 100644 --- a/app/src/components/v-checkbox/v-checkbox.vue +++ b/app/src/components/v-checkbox/v-checkbox.vue @@ -31,7 +31,7 @@ export default defineComponent({ }, modelValue: { type: [Boolean, Array], - default: false, + default: null, }, label: { type: String, @@ -86,6 +86,8 @@ export default defineComponent({ const icon = computed(() => { if (props.indeterminate === true) return props.iconIndeterminate; + if (props.checked === null && props.modelValue === null) return props.iconIndeterminate; + return isChecked.value ? props.iconOn : props.iconOff; }); @@ -175,6 +177,7 @@ body { width: 100%; height: var(--input-height); padding: 10px; // 14 - 4 (border) + background-color: var(--background-page); border: var(--border-width) solid var(--border-normal); border-radius: var(--border-radius); transition: all var(--fast) var(--transition); diff --git a/app/src/components/v-field-template/v-field-template.vue b/app/src/components/v-field-template/v-field-template.vue index 66f7edcc4d..bd318efa95 100644 --- a/app/src/components/v-field-template/v-field-template.vue +++ b/app/src/components/v-field-template/v-field-template.vue @@ -52,7 +52,7 @@ export default defineComponent({ }, collection: { type: String, - required: true, + default: null, }, depth: { type: Number, diff --git a/app/src/components/v-input/v-input.vue b/app/src/components/v-input/v-input.vue index 7e7fe1b7f6..8f6dfabbbc 100644 --- a/app/src/components/v-input/v-input.vue +++ b/app/src/components/v-input/v-input.vue @@ -86,7 +86,7 @@ export default defineComponent({ default: true, }, placeholder: { - type: String, + type: [String, Number], default: null, }, modelValue: { diff --git a/app/src/constants.ts b/app/src/constants.ts index 5ec6f044be..1d5e05fb4f 100644 --- a/app/src/constants.ts +++ b/app/src/constants.ts @@ -1,3 +1,5 @@ +import { Type } from '@directus/shared/types'; + export const VALIDATION_TYPES = ['FAILED_VALIDATION', 'RECORD_NOT_UNIQUE']; export const DIRECTUS_LOGO = ` @@ -70,4 +72,76 @@ export const MODULE_BAR_DEFAULT = [ }, ]; +export const FIELD_TYPES_SELECT: Array<{ value: Type; text: string } | { divider: true }> = [ + { + text: '$t:string', + value: 'string', + }, + { + text: '$t:text', + value: 'text', + }, + { divider: true }, + { + text: '$t:boolean', + value: 'boolean', + }, + { divider: true }, + { + text: '$t:integer', + value: 'integer', + }, + { + text: '$t:bigInteger', + value: 'bigInteger', + }, + { + text: '$t:float', + value: 'float', + }, + { + text: '$t:decimal', + value: 'decimal', + }, + { divider: true }, + { + text: '$t:geometry', + value: 'geometry', + }, + { divider: true }, + { + text: '$t:timestamp', + value: 'timestamp', + }, + { + text: '$t:datetime', + value: 'dateTime', + }, + { + text: '$t:date', + value: 'date', + }, + { + text: '$t:time', + value: 'time', + }, + { divider: true }, + { + text: '$t:json', + value: 'json', + }, + { + text: '$t:csv', + value: 'csv', + }, + { + text: '$t:uuid', + value: 'uuid', + }, + { + text: '$t:hash', + value: 'hash', + }, +]; + export const AUTH_SSO_DRIVERS = ['oauth2', 'openid']; diff --git a/app/src/displays/file/index.ts b/app/src/displays/file/index.ts index 1610d61607..7071792eb1 100644 --- a/app/src/displays/file/index.ts +++ b/app/src/displays/file/index.ts @@ -8,7 +8,7 @@ export default defineDisplay({ icon: 'insert_drive_file', component: DisplayFile, types: ['uuid'], - groups: ['file'], + localTypes: ['file'], options: [], fields: ['id', 'type', 'title'], }); diff --git a/app/src/displays/image/index.ts b/app/src/displays/image/index.ts index fad5caf564..49e71ed79e 100644 --- a/app/src/displays/image/index.ts +++ b/app/src/displays/image/index.ts @@ -6,7 +6,7 @@ export default defineDisplay({ name: '$t:displays.image.image', description: '$t:displays.image.description', types: ['uuid'], - groups: ['file'], + localTypes: ['file'], icon: 'insert_photo', component: DisplayImage, options: [ diff --git a/app/src/displays/raw/index.ts b/app/src/displays/raw/index.ts index 4e0fba1f8d..b1209469d8 100644 --- a/app/src/displays/raw/index.ts +++ b/app/src/displays/raw/index.ts @@ -8,5 +8,5 @@ export default defineDisplay({ component: ({ value }) => String(value), options: [], types: TYPES, - groups: ['file', 'files', 'group', 'm2a', 'm2m', 'm2o', 'o2m', 'presentation', 'standard', 'translations'], + localTypes: ['file', 'files', 'group', 'm2a', 'm2m', 'm2o', 'o2m', 'presentation', 'standard', 'translations'], }); diff --git a/app/src/displays/related-values/index.ts b/app/src/displays/related-values/index.ts index edbc920e8e..ad536cb6bd 100644 --- a/app/src/displays/related-values/index.ts +++ b/app/src/displays/related-values/index.ts @@ -18,7 +18,7 @@ export default defineDisplay({ component: DisplayRelatedValues, options: options, types: ['alias', 'string', 'uuid', 'integer', 'bigInteger', 'json'], - groups: ['m2m', 'm2o', 'o2m', 'translations', 'm2a'], + localTypes: ['m2m', 'm2o', 'o2m', 'translations', 'm2a'], fields: (options: Options | null, { field, collection }) => { const relatedCollection = getRelatedCollection(collection, field); const fieldsStore = useFieldsStore(); diff --git a/app/src/displays/translations/index.ts b/app/src/displays/translations/index.ts index 907bb05845..69025e3c2c 100644 --- a/app/src/displays/translations/index.ts +++ b/app/src/displays/translations/index.ts @@ -18,7 +18,7 @@ export default defineDisplay({ component: DisplayTranslations, options: options, types: ['alias'], - groups: ['translations'], + localTypes: ['translations'], fields: (options: Options | null, { field, collection }) => { const fieldsStore = useFieldsStore(); const relationsStore = useRelationsStore(); diff --git a/app/src/interfaces/_system/system-display-template/system-display-template.vue b/app/src/interfaces/_system/system-display-template/system-display-template.vue index 7649080b31..989792f622 100644 --- a/app/src/interfaces/_system/system-display-template/system-display-template.vue +++ b/app/src/interfaces/_system/system-display-template/system-display-template.vue @@ -1,11 +1,9 @@