diff --git a/api/src/routes/fields.ts b/api/src/routes/fields.ts index 021bc05747..e0ac301dc7 100644 --- a/api/src/routes/fields.ts +++ b/api/src/routes/fields.ts @@ -59,14 +59,14 @@ const newFieldSchema = Joi.object({ collection: Joi.string().optional(), field: Joi.string().required(), type: Joi.string().valid(...types), - database: Joi.object({ + schema: Joi.object({ comment: Joi.string(), default_value: Joi.any(), max_length: [Joi.number(), Joi.string()], is_nullable: Joi.bool(), }), /** @todo base this on default validation */ - system: Joi.any(), + meta: Joi.any(), }); router.post( diff --git a/api/src/services/collections.ts b/api/src/services/collections.ts index 9f580a3d01..aea781f1a0 100644 --- a/api/src/services/collections.ts +++ b/api/src/services/collections.ts @@ -27,9 +27,9 @@ export default class CollectionsService { if (!collection.fields) collection.fields = []; collection.fields = collection.fields.map((field) => { - if (field.system) { - field.system = { - ...field.system, + if (field.meta) { + field.meta = { + ...field.meta, field: field.field, collection: collection.collection!, }; @@ -76,8 +76,8 @@ export default class CollectionsService { await collectionItemsService.create(collectionInfo); const fieldPayloads = payload - .fields!.filter((field) => field.system) - .map((field) => field.system); + .fields!.filter((field) => field.meta) + .map((field) => field.meta); await fieldItemsService.create(fieldPayloads); @@ -122,7 +122,7 @@ export default class CollectionsService { const tablesInDatabase = await schemaInspector.tableInfo(); const tables = tablesInDatabase.filter((table) => collectionKeys.includes(table.name)); - const system: any[] = await collectionItemsService.readByQuery({ + const meta: any[] = await collectionItemsService.readByQuery({ filter: { collection: { _in: collectionKeys } }, }); @@ -131,8 +131,8 @@ export default class CollectionsService { for (const table of tables) { const collection: Collection = { collection: table.name, - system: system.find((systemInfo) => systemInfo.collection === table.name) || null, - database: table, + meta: meta.find((systemInfo) => systemInfo.collection === table.name) || null, + schema: table, }; collections.push(collection); @@ -160,7 +160,7 @@ export default class CollectionsService { } const tablesToFetchInfoFor = tablesInDatabase.map((table) => table.name); - const system: any[] = await collectionItemsService.readByQuery({ + const meta: any[] = await collectionItemsService.readByQuery({ filter: { collection: { _in: tablesToFetchInfoFor } }, }); @@ -169,8 +169,8 @@ export default class CollectionsService { for (const table of tablesInDatabase) { const collection: Collection = { collection: table.name, - system: system.find((systemInfo) => systemInfo.collection === table.name) || null, - database: table, + meta: meta.find((systemInfo) => systemInfo.collection === table.name) || null, + schema: table, }; collections.push(collection); @@ -198,11 +198,11 @@ export default class CollectionsService { if (data && key) { const payload = data as Partial; - if (!payload.system) { + if (!payload.meta) { throw new InvalidPayloadException(`"system" key is required`); } - return (await collectionItemsService.update(payload.system!, key as any)) as + return (await collectionItemsService.update(payload.meta!, key as any)) as | string | string[]; } @@ -211,7 +211,7 @@ export default class CollectionsService { const collectionUpdates = payloads.map((collection) => { return { - ...collection.system, + ...collection.meta, collection: collection.collection, }; }); diff --git a/api/src/services/fields.ts b/api/src/services/fields.ts index 7de2f2dfdc..f5d23052a4 100644 --- a/api/src/services/fields.ts +++ b/api/src/services/fields.ts @@ -1,7 +1,7 @@ import database, { schemaInspector } from '../database'; import { Field } from '../types/field'; import { uniq } from 'lodash'; -import { Accountability, AbstractServiceOptions, System } from '../types'; +import { Accountability, AbstractServiceOptions, FieldMeta } from '../types'; import ItemsService from '../services/items'; import { ColumnBuilder } from 'knex'; import getLocalType from '../utils/get-local-type'; @@ -44,17 +44,17 @@ export default class FieldsService { } async readAll(collection?: string) { - let fields: System[]; + let fields: FieldMeta[]; if (collection) { fields = (await this.itemsService.readByQuery({ filter: { collection: { _eq: collection } }, - })) as System[]; + })) as FieldMeta[]; } else { - fields = (await this.itemsService.readByQuery({})) as System[]; + fields = (await this.itemsService.readByQuery({})) as FieldMeta[]; } - fields = (await this.payloadService.processValues('read', fields)) as System[]; + fields = (await this.payloadService.processValues('read', fields)) as FieldMeta[]; let columns = await schemaInspector.columnInfo(collection); @@ -74,27 +74,27 @@ export default class FieldsService { collection: column.table, field: column.name, type: column ? getLocalType(column.type) : 'alias', - database: column, - system: field || null, + schema: column, + meta: field || null, }; return data as Field; }); let aliasFields = await this.knex - .select('*') + .select('*') .from('directus_fields') .whereIn('special', ['alias', 'o2m']); - aliasFields = (await this.payloadService.processValues('read', aliasFields)) as System[]; + aliasFields = (await this.payloadService.processValues('read', aliasFields)) as FieldMeta[]; const aliasFieldsAsField = aliasFields.map((field) => { const data = { collection: field.collection, field: field.field, type: field.special, - database: null, - system: field, + schema: null, + meta: field, }; return data; @@ -112,7 +112,7 @@ export default class FieldsService { .where({ collection, field }) .first(); - fieldInfo = (await this.payloadService.processValues('read', fieldInfo)) as System[]; + fieldInfo = (await this.payloadService.processValues('read', fieldInfo)) as FieldMeta[]; try { column = await schemaInspector.columnInfo(collection, field); @@ -140,7 +140,7 @@ export default class FieldsService { * Check if table / directus_fields row already exists */ - if (field.database) { + if (field.schema) { if (table) { this.addColumnToTable(table, field as Field); } else { @@ -150,9 +150,9 @@ export default class FieldsService { } } - if (field.system) { + if (field.meta) { await this.itemsService.create({ - ...field.system, + ...field.meta, collection: collection, field: field.field, }); @@ -162,16 +162,16 @@ export default class FieldsService { /** @todo research how to make this happen in SQLite / Redshift */ async updateField(collection: string, field: RawField, accountability?: Accountability) { - if (field.database) { - await database.schema.alterTable(collection, (table) => { + if (field.schema) { + await this.knex.schema.alterTable(collection, (table) => { let column: ColumnBuilder; - if (!field.database) return; + if (!field.schema) return; if (field.type === 'string') { column = table.string( field.field, - field.database.max_length !== null ? field.database.max_length : undefined + field.schema.max_length !== null ? field.schema.max_length : undefined ); } else if (['float', 'decimal'].includes(field.type)) { const type = field.type as 'float' | 'decimal'; @@ -181,14 +181,11 @@ export default class FieldsService { column = table[field.type](field.field); } - if (field.database.default_value) { - column.defaultTo(field.database.default_value); + if (field.schema.default_value) { + column.defaultTo(field.schema.default_value); } - if ( - field.database.is_nullable !== undefined && - field.database.is_nullable === false - ) { + if (field.schema.is_nullable !== undefined && field.schema.is_nullable === false) { column.notNullable(); } else { column.nullable(); @@ -198,7 +195,7 @@ export default class FieldsService { }); } - if (field.system) { + if (field.meta) { const record = await database .select<{ id: number }>('id') .from('directus_fields') @@ -206,7 +203,7 @@ export default class FieldsService { .first(); if (!record) throw new FieldNotFoundException(collection, field.field); await database('directus_fields') - .update(field.system) + .update(field.meta) .where({ collection, field: field.field }); } @@ -225,10 +222,10 @@ export default class FieldsService { public addColumnToTable(table: CreateTableBuilder, field: Field) { let column: ColumnBuilder; - if (field.database?.has_auto_increment) { + if (field.schema?.has_auto_increment) { column = table.increments(field.field); } else if (field.type === 'string') { - column = table.string(field.field, field.database?.max_length || undefined); + column = table.string(field.field, field.schema?.max_length || undefined); } else if (['float', 'decimal'].includes(field.type)) { const type = field.type as 'float' | 'decimal'; /** @todo add precision and scale support */ @@ -237,17 +234,17 @@ export default class FieldsService { column = table[field.type](field.field); } - if (field.database?.default_value) { - column.defaultTo(field.database.default_value); + if (field.schema?.default_value) { + column.defaultTo(field.schema.default_value); } - if (field.database.is_nullable !== undefined && field.database.is_nullable === false) { + if (field.schema.is_nullable !== undefined && field.schema.is_nullable === false) { column.notNullable(); } else { column.nullable(); } - if (field.database?.is_primary_key) { + if (field.schema?.is_primary_key) { column.primary(); } } diff --git a/api/src/services/payload.ts b/api/src/services/payload.ts index 1562d6bff4..1bee983eeb 100644 --- a/api/src/services/payload.ts +++ b/api/src/services/payload.ts @@ -3,7 +3,7 @@ * handled correctly. */ -import { System } from '../types/field'; +import { FieldMeta } from '../types/field'; import argon2 from 'argon2'; import { v4 as uuidv4 } from 'uuid'; import database from '../database'; @@ -104,7 +104,7 @@ export default class PayloadService { const specialFieldsQuery = this.knex .select('field', 'special') - .from('directus_fields') + .from('directus_fields') .where({ collection: this.collection }) .whereNotNull('special'); @@ -143,7 +143,7 @@ export default class PayloadService { } async processField( - field: Pick, + field: Pick, payload: Partial, operation: Operation ) { diff --git a/api/src/types/collection.ts b/api/src/types/collection.ts index 95c863efa5..6d10ad9c8a 100644 --- a/api/src/types/collection.ts +++ b/api/src/types/collection.ts @@ -4,7 +4,7 @@ import { Table } from 'knex-schema-inspector/lib/types/table'; export type Collection = { collection: string; fields?: Field[]; - system: { + meta: { collection: string; note: string | null; hidden: boolean; @@ -12,5 +12,5 @@ export type Collection = { icon: string | null; translation: Record; } | null; - database: Table; + schema: Table; }; diff --git a/api/src/types/field.ts b/api/src/types/field.ts index 5c4f81bfd2..3f1ef53c3b 100644 --- a/api/src/types/field.ts +++ b/api/src/types/field.ts @@ -17,7 +17,7 @@ export const types = [ 'uuid', ] as const; -export type System = { +export type FieldMeta = { id: number; collection: string; field: string; @@ -40,6 +40,6 @@ export type Field = { collection: string; field: string; type: typeof types[number]; - database: Column; - system: System | null; + schema: Column; + meta: FieldMeta | null; }; diff --git a/app/src/components/v-form/form-field-interface.vue b/app/src/components/v-form/form-field-interface.vue index 661168cc3d..03282865f6 100644 --- a/app/src/components/v-form/form-field-interface.vue +++ b/app/src/components/v-form/form-field-interface.vue @@ -9,11 +9,11 @@ { - return !!interfaces.find((inter) => inter.id === props.field.system.interface); + return !!interfaces.find((inter) => inter.id === props.field.meta.interface); }); return { interfaceExists }; diff --git a/app/src/components/v-form/form-field.vue b/app/src/components/v-form/form-field.vue index 6044266d80..2c3593f0b6 100644 --- a/app/src/components/v-form/form-field.vue +++ b/app/src/components/v-form/form-field.vue @@ -1,5 +1,5 @@ @@ -90,7 +90,7 @@ export default defineComponent({ setup(props) { const isDisabled = computed(() => { if (props.disabled) return true; - if (props.field.system.readonly) return true; + if (props.field.meta.readonly) return true; if (props.batchMode && props.batchActive === false) return true; return false; }); @@ -98,7 +98,7 @@ export default defineComponent({ const _value = computed(() => { if (props.value !== undefined) return props.value; if (props.initialValue !== undefined) return props.initialValue; - return props.field.database?.default_value; + return props.field.schema?.default_value; }); return { isDisabled, marked, _value }; diff --git a/app/src/components/v-form/v-form.vue b/app/src/components/v-form/v-form.vue index 8914797f49..8754633492 100644 --- a/app/src/components/v-form/v-form.vue +++ b/app/src/components/v-form/v-form.vue @@ -130,7 +130,7 @@ export default defineComponent({ return ( props.loading || props.disabled === true || - field.system.readonly === true || + field.meta.readonly === true || (props.batchMode && batchActiveFields.value.includes(field.field) === false) ); } diff --git a/app/src/composables/use-collection/use-collection.ts b/app/src/composables/use-collection/use-collection.ts index 3e685e7956..e950977717 100644 --- a/app/src/composables/use-collection/use-collection.ts +++ b/app/src/composables/use-collection/use-collection.ts @@ -21,20 +21,20 @@ export function useCollection(collectionKey: string | Ref) { // Every collection has a primary key; rules of the land // eslint-disable-next-line @typescript-eslint/no-non-null-assertion return fields.value?.find( - (field) => field.collection === collection.value && field.database?.is_primary_key === true + (field) => field.collection === collection.value && field.schema?.is_primary_key === true )!; }); const userCreatedField = computed(() => { - return fields.value?.find((field) => field.system?.special === 'user_created') || null; + return fields.value?.find((field) => field.meta?.special === 'user_created') || null; }); const statusField = computed(() => { - return fields.value?.find((field) => field.system?.special === 'status') || null; + return fields.value?.find((field) => field.meta?.special === 'status') || null; }); const sortField = computed(() => { - return fields.value?.find((field) => field.system?.special === 'sort') || null; + return fields.value?.find((field) => field.meta?.special === 'sort') || null; }); type Status = { @@ -52,7 +52,7 @@ export function useCollection(collectionKey: string | Ref) { const softDeleteStatus = computed(() => { if (statusField.value === null) return null; - const statuses = Object.values(statusField.value?.system?.options?.status_mapping || {}); + const statuses = Object.values(statusField.value?.meta?.options?.status_mapping || {}); return ( (statuses.find((status) => (status as Status).soft_delete === true) as Status | undefined)?.value || null ); 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 4bd16bf407..efc2831c0a 100644 --- a/app/src/composables/use-field-tree/use-field-tree.ts +++ b/app/src/composables/use-field-tree/use-field-tree.ts @@ -13,7 +13,7 @@ export default function useFieldTree(collection: Ref) { return fieldsStore .getFieldsForCollection(collection.value) .filter( - (field: Field) => field.system?.hidden === false && field.system?.special?.toLowerCase() !== 'alias' + (field: Field) => field.meta?.hidden === false && field.meta?.special?.toLowerCase() !== 'alias' ) .map((field: Field) => parseField(field, [])); @@ -43,7 +43,7 @@ export default function useFieldTree(collection: Ref) { .getFieldsForCollection(relatedCollection) .filter( (field: Field) => - field.system?.hidden === false && field.system?.special?.toLowerCase() !== 'alias' + field.meta?.hidden === false && field.meta?.special?.toLowerCase() !== 'alias' ); }) .flat() diff --git a/app/src/composables/use-form-fields/use-form-fields.ts b/app/src/composables/use-form-fields/use-form-fields.ts index 0ebfd75ba3..8e4811fad3 100644 --- a/app/src/composables/use-form-fields/use-form-fields.ts +++ b/app/src/composables/use-form-fields/use-form-fields.ts @@ -13,8 +13,8 @@ export default function useFormFields(fields: Ref) { // Sort the fields on the sort column value formFields = formFields.sort((a, b) => { - const aSort = a.system?.sort || null; - const bSort = b.system?.sort || null; + const aSort = a.meta?.sort || null; + const bSort = b.meta?.sort || null; if (aSort === bSort) return 0; if (aSort === null) return 1; @@ -23,8 +23,8 @@ export default function useFormFields(fields: Ref) { }); formFields = formFields.map((field, index) => { - if (!field.system) { - field.system = { + if (!field.meta) { + field.meta = { id: -1, collection: field.collection, field: field.field, @@ -45,18 +45,18 @@ export default function useFormFields(fields: Ref) { }; } - if (!field.system.width) { - field.system.width = 'full'; + if (!field.meta.width) { + field.meta.width = 'full'; } - let interfaceUsed = interfaces.find((int) => int.id === field.system.interface); + let interfaceUsed = interfaces.find((int) => int.id === field.meta.interface); const interfaceExists = interfaceUsed !== undefined; if (interfaceExists === false) { - field.system.interface = getDefaultInterfaceForType(field.type); + field.meta.interface = getDefaultInterfaceForType(field.type); } - interfaceUsed = interfaces.find((int) => int.id === field.system.interface); + interfaceUsed = interfaces.find((int) => int.id === field.meta.interface); if (interfaceUsed?.hideLabel === true) { (field as FormField).hideLabel = true; @@ -66,11 +66,11 @@ export default function useFormFields(fields: Ref) { (field as FormField).hideLoader = true; } - if (index !== 0 && field.system!.width === 'half') { + if (index !== 0 && field.meta!.width === 'half') { const prevField = formFields[index - 1]; - if (prevField.system.width === 'half') { - field.system.width = 'half-right'; + if (prevField.meta.width === 'half') { + field.meta.width = 'half-right'; } } @@ -79,7 +79,7 @@ export default function useFormFields(fields: Ref) { // Filter out the fields that are marked hidden on detail formFields = formFields.filter((field) => { - const hidden = field.system?.hidden; + const hidden = field.meta?.hidden; const systemFake = field.field.startsWith('$'); return hidden !== true && systemFake === false; }); diff --git a/app/src/interfaces/checkboxes/index.ts b/app/src/interfaces/checkboxes/index.ts index b2bb2b0737..08a98bd4be 100644 --- a/app/src/interfaces/checkboxes/index.ts +++ b/app/src/interfaces/checkboxes/index.ts @@ -12,7 +12,7 @@ export default defineInterface(({ i18n }) => ({ field: 'choices', type: 'json', name: i18n.t('choices'), - system: { + meta: { width: 'full', interface: 'repeater', options: { @@ -22,7 +22,7 @@ export default defineInterface(({ i18n }) => ({ field: 'text', type: 'string', name: i18n.t('text'), - system: { + meta: { interface: 'text-input', } }, @@ -30,7 +30,7 @@ export default defineInterface(({ i18n }) => ({ field: 'value', type: 'string', name: i18n.t('value'), - system: { + meta: { interface: 'text-input', options: { font: 'monospace' @@ -45,11 +45,11 @@ export default defineInterface(({ i18n }) => ({ field: 'allowOther', name: i18n.t('allow_other'), type: 'boolean', - system: { + meta: { width: 'half', interface: 'toggle', }, - database: { + schema: { default_value: false, } }, @@ -57,11 +57,11 @@ export default defineInterface(({ i18n }) => ({ field: 'iconOff', name: i18n.t('icon_off'), type: 'string', - system: { + meta: { width: 'half', interface: 'icon', }, - database: { + schema: { default_value: 'check_box_outline_blank', } }, @@ -69,11 +69,11 @@ export default defineInterface(({ i18n }) => ({ field: 'iconOn', name: i18n.t('icon_on'), type: 'string', - system: { + meta: { width: 'half', interface: 'icon', }, - database: { + schema: { default_value: 'check_box', } }, @@ -81,11 +81,11 @@ export default defineInterface(({ i18n }) => ({ field: 'color', name: i18n.t('color'), type: 'string', - system: { + meta: { width: 'half', interface: 'color', }, - database: { + schema: { default_value: '#2f80ed', } }, diff --git a/app/src/interfaces/code/index.ts b/app/src/interfaces/code/index.ts index 60ae2e799a..4ed4141e7a 100644 --- a/app/src/interfaces/code/index.ts +++ b/app/src/interfaces/code/index.ts @@ -21,14 +21,14 @@ export default defineInterface(({ i18n }) => ({ field: 'template', name: i18n.t('template'), type: 'text', - system: { + meta: { width: 'full', interface: 'code', options: { language: 'text/plain' } }, - database: { + schema: { default_value: null, } }, @@ -36,11 +36,11 @@ export default defineInterface(({ i18n }) => ({ field: 'lineNumber', name: i18n.t('line_number'), type: 'boolean', - system: { + meta: { width: 'half', interface: 'toggle', }, - database: { + schema: { default_value: false, } }, @@ -48,7 +48,7 @@ export default defineInterface(({ i18n }) => ({ field: 'language', name: i18n.t('language'), type: 'string', - system: { + meta: { width: 'half', interface: 'dropdown', options: { choices }, diff --git a/app/src/interfaces/collections/collections.vue b/app/src/interfaces/collections/collections.vue index c29ee56032..6814b2bcb4 100644 --- a/app/src/interfaces/collections/collections.vue +++ b/app/src/interfaces/collections/collections.vue @@ -16,7 +16,7 @@ export default defineComponent({ type: Boolean, default: false, }, - includeSystem: { + includeMeta: { type: Boolean, default: false, }, @@ -25,7 +25,7 @@ export default defineComponent({ const collectionsStore = useCollectionsStore(); const collections = computed(() => { - if (props.includeSystem) return collectionsStore.state.collections; + if (props.includeMeta) return collectionsStore.state.collections; return collectionsStore.state.collections.filter( (collection) => collection.collection.startsWith('directus_') === false diff --git a/app/src/interfaces/collections/index.ts b/app/src/interfaces/collections/index.ts index 8281e4f50a..7e8803eea2 100644 --- a/app/src/interfaces/collections/index.ts +++ b/app/src/interfaces/collections/index.ts @@ -12,14 +12,14 @@ export default defineInterface(({ i18n }) => ({ field: 'includeSystem', name: i18n.t('system'), type: 'boolean', - system: { + meta: { width: 'half', interface: 'toggle', options: { label: i18n.t('include_system_collections'), }, }, - database: { + schema: { default_value: false, } }, diff --git a/app/src/interfaces/color/index.ts b/app/src/interfaces/color/index.ts index 4b8a865e53..d1de3da3c7 100644 --- a/app/src/interfaces/color/index.ts +++ b/app/src/interfaces/color/index.ts @@ -12,7 +12,7 @@ export default defineInterface(({ i18n }) => ({ field: 'presets', name: i18n.t('preset_colors'), type: 'string', - system: { + meta: { width: 'full', interface: 'repeater', options: { @@ -22,7 +22,7 @@ export default defineInterface(({ i18n }) => ({ field: 'name', type: 'string', name: i18n.t('name'), - system: { + meta: { interface: 'text-input', width: 'half', } @@ -31,7 +31,7 @@ export default defineInterface(({ i18n }) => ({ field: 'color', type: 'string', name: i18n.t('color'), - system: { + meta: { interface: 'color', width: 'half' } diff --git a/app/src/interfaces/datetime/index.ts b/app/src/interfaces/datetime/index.ts index c289d1ead3..15918b9da6 100644 --- a/app/src/interfaces/datetime/index.ts +++ b/app/src/interfaces/datetime/index.ts @@ -11,11 +11,11 @@ export default defineInterface(({ i18n }) => ({ { field: 'includeSeconds', name: i18n.t('include_seconds'), - system: { + meta: { width: 'half', interface: 'toggle', }, - database: { + schema: { default_value: false, }, }, diff --git a/app/src/interfaces/divider/index.ts b/app/src/interfaces/divider/index.ts index 055d2d2291..7fd2be2b6a 100644 --- a/app/src/interfaces/divider/index.ts +++ b/app/src/interfaces/divider/index.ts @@ -14,7 +14,7 @@ export default defineInterface(({ i18n }) => ({ field: 'color', name: i18n.t('color'), type: 'string', - system: { + meta: { width: 'half', interface: 'color', } @@ -23,7 +23,7 @@ export default defineInterface(({ i18n }) => ({ field: 'icon', name: i18n.t('icon'), type: 'string', - system: { + meta: { width: 'half', interface: 'icon', } @@ -32,7 +32,7 @@ export default defineInterface(({ i18n }) => ({ field: 'title', name: i18n.t('title'), type: 'string', - system: { + meta: { width: 'half', interface: 'text-input', } diff --git a/app/src/interfaces/dropdown-multiselect/index.ts b/app/src/interfaces/dropdown-multiselect/index.ts index 57e684a81b..9948928970 100644 --- a/app/src/interfaces/dropdown-multiselect/index.ts +++ b/app/src/interfaces/dropdown-multiselect/index.ts @@ -12,7 +12,7 @@ export default defineInterface(({ i18n }) => ({ field: 'choices', type: 'json', name: i18n.t('choices'), - system: { + meta: { width: 'full', interface: 'repeater', options: { @@ -22,7 +22,7 @@ export default defineInterface(({ i18n }) => ({ field: 'text', type: 'string', name: i18n.t('text'), - system: { + meta: { interface: 'text-input', } }, @@ -30,7 +30,7 @@ export default defineInterface(({ i18n }) => ({ field: 'value', type: 'string', name: i18n.t('value'), - system: { + meta: { interface: 'text-input', options: { font: 'monospace' @@ -45,7 +45,7 @@ export default defineInterface(({ i18n }) => ({ field: 'allowOther', name: i18n.t('allow_other'), type: 'boolean', - system: { + meta: { width: 'half', interface: 'toggle', default_value: false, @@ -55,7 +55,7 @@ export default defineInterface(({ i18n }) => ({ field: 'allowNone', name: i18n.t('allow_none'), type: 'boolean', - system: { + meta: { width: 'half', interface: 'toggle', default_value: false, @@ -65,7 +65,7 @@ export default defineInterface(({ i18n }) => ({ field: 'icon', name: i18n.t('icon'), type: 'string', - system: { + meta: { width: 'half', interface: 'icon', } diff --git a/app/src/interfaces/dropdown/index.ts b/app/src/interfaces/dropdown/index.ts index 3d75297629..d4dd40347b 100644 --- a/app/src/interfaces/dropdown/index.ts +++ b/app/src/interfaces/dropdown/index.ts @@ -12,7 +12,7 @@ export default defineInterface(({ i18n }) => ({ field: 'choices', type: 'json', name: i18n.t('choices'), - system: { + meta: { width: 'full', interface: 'repeater', options: { @@ -22,7 +22,7 @@ export default defineInterface(({ i18n }) => ({ field: 'text', type: 'string', name: i18n.t('text'), - system: { + meta: { interface: 'text-input', } }, @@ -30,7 +30,7 @@ export default defineInterface(({ i18n }) => ({ field: 'value', type: 'string', name: i18n.t('value'), - system: { + meta: { interface: 'text-input', options: { font: 'monospace' @@ -45,7 +45,7 @@ export default defineInterface(({ i18n }) => ({ field: 'allowOther', name: i18n.t('allow_other'), type: 'boolean', - system: { + meta: { width: 'half', interface: 'toggle', default_value: false, @@ -55,7 +55,7 @@ export default defineInterface(({ i18n }) => ({ field: 'allowNone', name: i18n.t('allow_none'), type: 'boolean', - system: { + meta: { width: 'half', interface: 'toggle', default_value: false, @@ -65,7 +65,7 @@ export default defineInterface(({ i18n }) => ({ field: 'icon', name: i18n.t('icon'), type: 'string', - system: { + meta: { width: 'half', interface: 'icon', } @@ -74,7 +74,7 @@ export default defineInterface(({ i18n }) => ({ field: 'placeholder', name: i18n.t('placeholder'), type: 'string', - system: { + meta: { width: 'half', interface: 'text-input', } diff --git a/app/src/interfaces/hash/index.ts b/app/src/interfaces/hash/index.ts index a586d95678..451145183c 100644 --- a/app/src/interfaces/hash/index.ts +++ b/app/src/interfaces/hash/index.ts @@ -12,7 +12,7 @@ export default defineInterface(({ i18n }) => ({ field: 'placeholder', name: i18n.t('placeholder'), type: 'string', - system: { + meta: { width: 'half', interface: 'text-input', } @@ -21,7 +21,7 @@ export default defineInterface(({ i18n }) => ({ field: 'masked', name: i18n.t('masked'), type: 'boolean', - system: { + meta: { width: 'half', interface: 'toggle', } diff --git a/app/src/interfaces/many-to-one/index.ts b/app/src/interfaces/many-to-one/index.ts index 912b820836..aa8bfe73b0 100644 --- a/app/src/interfaces/many-to-one/index.ts +++ b/app/src/interfaces/many-to-one/index.ts @@ -13,7 +13,7 @@ export default defineInterface(({ i18n }) => ({ field: 'template', name: i18n.t('display_template'), type: 'string', - system: { + meta: { width: 'half', interface: 'text-input', } diff --git a/app/src/interfaces/notice/index.ts b/app/src/interfaces/notice/index.ts index 5f6a189a27..d42a1d52bd 100644 --- a/app/src/interfaces/notice/index.ts +++ b/app/src/interfaces/notice/index.ts @@ -14,7 +14,7 @@ export default defineInterface(({ i18n }) => ({ field: 'color', name: i18n.t('color'), type: 'string', - system: { + meta: { width: 'half', interface: 'dropdown', default_value: 'normal', @@ -33,7 +33,7 @@ export default defineInterface(({ i18n }) => ({ field: 'icon', name: i18n.t('icon'), type: 'string', - system: { + meta: { width: 'half', interface: 'icon', } @@ -42,7 +42,7 @@ export default defineInterface(({ i18n }) => ({ field: 'text', name: i18n.t('text'), type: 'string', - system: { + meta: { width: 'full', interface: 'textarea', } diff --git a/app/src/interfaces/numeric/index.ts b/app/src/interfaces/numeric/index.ts index b3e81f7f88..107043b680 100644 --- a/app/src/interfaces/numeric/index.ts +++ b/app/src/interfaces/numeric/index.ts @@ -12,7 +12,7 @@ export default defineInterface(({ i18n }) => ({ field: 'placeholder', name: i18n.t('placeholder'), type: 'string', - system: { + meta: { width: 'half', interface: 'text-input', } @@ -21,7 +21,7 @@ export default defineInterface(({ i18n }) => ({ field: 'min', name: i18n.t('minimum_value'), type: 'integer', - system: { + meta: { width: 'half', interface: 'numeric', } @@ -30,7 +30,7 @@ export default defineInterface(({ i18n }) => ({ field: 'max', name: i18n.t('maximum_value'), type: 'integer', - system: { + meta: { width: 'half', interface: 'numeric', } @@ -39,7 +39,7 @@ export default defineInterface(({ i18n }) => ({ field: 'step', name: i18n.t('step_interval'), type: 'integer', - system: { + meta: { width: 'half', interface: 'numeric', } @@ -48,7 +48,7 @@ export default defineInterface(({ i18n }) => ({ field: 'iconLeft', name: i18n.t('icon_left'), type: 'string', - system: { + meta: { width: 'half', interface: 'icon', } @@ -57,7 +57,7 @@ export default defineInterface(({ i18n }) => ({ field: 'iconRight', name: i18n.t('icon_right'), type: 'string', - system: { + meta: { width: 'half', interface: 'icon', } @@ -66,7 +66,7 @@ export default defineInterface(({ i18n }) => ({ field: 'font', name: i18n.t('font'), type: 'string', - system: { + meta: { width: 'half', interface: 'dropdown', options: { diff --git a/app/src/interfaces/radio-buttons/index.ts b/app/src/interfaces/radio-buttons/index.ts index aa7289927d..a1e3100cd1 100644 --- a/app/src/interfaces/radio-buttons/index.ts +++ b/app/src/interfaces/radio-buttons/index.ts @@ -12,7 +12,7 @@ export default defineInterface(({ i18n }) => ({ field: 'choices', type: 'json', name: i18n.t('choices'), - system: { + meta: { width: 'full', interface: 'repeater', options: { @@ -22,7 +22,7 @@ export default defineInterface(({ i18n }) => ({ field: 'text', type: 'string', name: i18n.t('text'), - system: { + meta: { interface: 'text-input', } }, @@ -30,7 +30,7 @@ export default defineInterface(({ i18n }) => ({ field: 'value', type: 'string', name: i18n.t('value'), - system: { + meta: { interface: 'text-input', options: { font: 'monospace' @@ -45,7 +45,7 @@ export default defineInterface(({ i18n }) => ({ field: 'allowOther', name: i18n.t('allow_other'), type: 'string', - system: { + meta: { width: 'half', interface: 'toggle', default_value: false, @@ -55,7 +55,7 @@ export default defineInterface(({ i18n }) => ({ field: 'iconOff', name: i18n.t('icon_off'), type: 'string', - system: { + meta: { width: 'half', interface: 'icon', default_value: 'check_box_outline_blank', @@ -65,7 +65,7 @@ export default defineInterface(({ i18n }) => ({ field: 'iconOn', name: i18n.t('icon_on'), type: 'string', - system: { + meta: { width: 'half', interface: 'icon', default_value: 'check_box', @@ -75,7 +75,7 @@ export default defineInterface(({ i18n }) => ({ field: 'color', name: i18n.t('color'), type: 'string', - system: { + meta: { width: 'half', interface: 'color', default_value: 'var(--primary)', diff --git a/app/src/interfaces/repeater/repeater.vue b/app/src/interfaces/repeater/repeater.vue index fb85cb9bbe..e6246b36d6 100644 --- a/app/src/interfaces/repeater/repeater.vue +++ b/app/src/interfaces/repeater/repeater.vue @@ -99,7 +99,7 @@ export default defineComponent({ props.fields.forEach((field) => { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - newDefaults[field.field!] = field.database?.default_value; + newDefaults[field.field!] = field.schema?.default_value; }); if (props.value !== null) { diff --git a/app/src/interfaces/slider/index.ts b/app/src/interfaces/slider/index.ts index 3e3d5e7efc..4000ff422f 100644 --- a/app/src/interfaces/slider/index.ts +++ b/app/src/interfaces/slider/index.ts @@ -12,7 +12,7 @@ export default defineInterface(({ i18n }) => ({ field: 'minValue', name: i18n.t('minimum_value'), type: 'integer', - system: { + meta: { width: 'half', interface: 'numeric', } @@ -21,7 +21,7 @@ export default defineInterface(({ i18n }) => ({ field: 'maxValue', name: i18n.t('maximum_value'), type: 'integer', - system: { + meta: { width: 'half', interface: 'numeric', } @@ -30,7 +30,7 @@ export default defineInterface(({ i18n }) => ({ field: 'stepInterval', name: i18n.t('step_interval'), type: 'integer', - system: { + meta: { width: 'half', interface: 'numeric', } diff --git a/app/src/interfaces/status/index.ts b/app/src/interfaces/status/index.ts index f99f3fb2c7..5addd390da 100644 --- a/app/src/interfaces/status/index.ts +++ b/app/src/interfaces/status/index.ts @@ -13,7 +13,7 @@ export default defineInterface(({ i18n }) => ({ field: 'status_mapping', name: i18n.t('status_mapping'), type: 'json', - system: { + meta: { width: 'full', interface: 'code', options: { diff --git a/app/src/interfaces/tags/index.ts b/app/src/interfaces/tags/index.ts index 0869fa5362..c8489b32a6 100644 --- a/app/src/interfaces/tags/index.ts +++ b/app/src/interfaces/tags/index.ts @@ -12,7 +12,7 @@ export default defineInterface(({ i18n }) => ({ field: 'placeholder', name: i18n.t('placeholder'), type: 'string', - system: { + meta: { width: 'half', interface: 'text-input', } @@ -21,7 +21,7 @@ export default defineInterface(({ i18n }) => ({ field: 'lowercase', name: i18n.t('lowercase'), type: 'boolean', - system: { + meta: { width: 'half', interface: 'toggle', } @@ -30,7 +30,7 @@ export default defineInterface(({ i18n }) => ({ field: 'alphabetize', name: i18n.t('alphabetize'), type: 'boolean', - system: { + meta: { width: 'half', interface: 'toggle', } @@ -39,7 +39,7 @@ export default defineInterface(({ i18n }) => ({ field: 'iconLeft', name: i18n.t('icon_left'), type: 'string', - system: { + meta: { width: 'half', interface: 'icon', } @@ -48,7 +48,7 @@ export default defineInterface(({ i18n }) => ({ field: 'iconRight', name: i18n.t('icon_right'), type: 'string', - system: { + meta: { width: 'half', interface: 'icon', } @@ -57,7 +57,7 @@ export default defineInterface(({ i18n }) => ({ field: 'presets', name: i18n.t('presets'), type: 'string', - system: { + meta: { width: 'full', interface: 'text-input', } @@ -66,7 +66,7 @@ export default defineInterface(({ i18n }) => ({ field: 'allowCustom', name: i18n.t('allow_custom'), type: 'boolean', - system: { + meta: { width: 'half', interface: 'toggle', } diff --git a/app/src/interfaces/text-input/index.ts b/app/src/interfaces/text-input/index.ts index f5c6ba21bd..ec09b8fd6f 100644 --- a/app/src/interfaces/text-input/index.ts +++ b/app/src/interfaces/text-input/index.ts @@ -11,7 +11,7 @@ export default defineInterface(({ i18n }) => ({ { field: 'placeholder', name: i18n.t('placeholder'), - system: { + meta: { width: 'half', interface: 'text-input', }, @@ -19,7 +19,7 @@ export default defineInterface(({ i18n }) => ({ { field: 'iconLeft', name: i18n.t('icon_left'), - system: { + meta: { width: 'half', interface: 'icon', }, @@ -27,7 +27,7 @@ export default defineInterface(({ i18n }) => ({ { field: 'iconRight', name: i18n.t('icon_right'), - system: { + meta: { width: 'half', interface: 'icon', }, @@ -35,7 +35,7 @@ export default defineInterface(({ i18n }) => ({ { field: 'font', name: i18n.t('font'), - system: { + meta: { width: 'half', interface: 'dropdown', default: 'sans-serif', diff --git a/app/src/interfaces/toggle/index.ts b/app/src/interfaces/toggle/index.ts index 7a71743dcc..e299a2762c 100644 --- a/app/src/interfaces/toggle/index.ts +++ b/app/src/interfaces/toggle/index.ts @@ -12,7 +12,7 @@ export default defineInterface(({ i18n }) => ({ field: 'iconOff', name: i18n.t('icon_off'), type: 'string', - system: { + meta: { width: 'half', interface: 'icon', default_value: 'check_box_outline_blank', @@ -22,7 +22,7 @@ export default defineInterface(({ i18n }) => ({ field: 'iconOn', name: i18n.t('icon_on'), type: 'string', - system: { + meta: { width: 'half', interface: 'icon', default_value: 'check_box', @@ -32,7 +32,7 @@ export default defineInterface(({ i18n }) => ({ field: 'label', name: i18n.t('label'), type: 'string', - system: { + meta: { width: 'half', interface: 'text-input', default_value: i18n.t('active'), @@ -42,7 +42,7 @@ export default defineInterface(({ i18n }) => ({ field: 'color', name: i18n.t('color'), type: 'string', - system: { + meta: { width: 'half', interface: 'color', default_value: 'var(--primary)', diff --git a/app/src/interfaces/wysiwyg/index.ts b/app/src/interfaces/wysiwyg/index.ts index 603bb6b1d7..ba2f5ccb6b 100644 --- a/app/src/interfaces/wysiwyg/index.ts +++ b/app/src/interfaces/wysiwyg/index.ts @@ -12,7 +12,7 @@ export default defineInterface(({ i18n }) => ({ field: 'toolbar', name: i18n.t('toolbar'), type: 'json', - system: { + meta: { width: 'full', interface: 'checkboxes', default_value: [ @@ -219,7 +219,7 @@ export default defineInterface(({ i18n }) => ({ field: 'font', name: i18n.t('font'), type: 'string', - system: { + meta: { width: 'half', interface: 'dropdown', default: 'sans-serif', @@ -236,7 +236,7 @@ export default defineInterface(({ i18n }) => ({ field: 'customFormats', name: i18n.t('custom_formats'), type: 'json', - system: { + meta: { interface: 'code', options: { language: 'json', @@ -254,7 +254,7 @@ export default defineInterface(({ i18n }) => ({ field: 'tinymceOverrides', name: i18n.t('tinymce_options_override'), type: 'json', - system: { + meta: { interface: 'code', options: { language: 'json', diff --git a/app/src/layouts/cards/cards.vue b/app/src/layouts/cards/cards.vue index aff371bcc1..09c087299c 100644 --- a/app/src/layouts/cards/cards.vue +++ b/app/src/layouts/cards/cards.vue @@ -222,7 +222,7 @@ export default defineComponent({ const { info, primaryKeyField, fields: fieldsInCollection } = useCollection(collection); const availableFields = computed(() => - fieldsInCollection.value.filter((field) => field.system.hidden !== true) + fieldsInCollection.value.filter((field) => field.meta.hidden !== true) ); const fileFields = computed(() => { diff --git a/app/src/layouts/tabular/tabular.vue b/app/src/layouts/tabular/tabular.vue index d5d101c734..4998e4a085 100644 --- a/app/src/layouts/tabular/tabular.vue +++ b/app/src/layouts/tabular/tabular.vue @@ -235,7 +235,7 @@ export default defineComponent({ const { info, primaryKeyField, fields: fieldsInCollection, sortField } = useCollection(collection); const availableFields = computed(() => - fieldsInCollection.value.filter((field) => field.system?.hidden === false) + fieldsInCollection.value.filter((field) => field.meta?.hidden === false) ); const { sort, limit, page, fields, fieldsWithRelational } = useItemOptions(); @@ -377,7 +377,7 @@ export default defineComponent({ _viewQuery.value?.fields || availableFields.value .filter((field: Field) => { - return field.database?.is_primary_key === false && field.system.special !== 'sort'; + return field.schema?.is_primary_key === false && field.meta.special !== 'sort'; }) .slice(0, 4) .map(({ field }) => field); @@ -433,10 +433,10 @@ export default defineComponent({ value: field.field, width: localWidths.value[field.field] || _viewOptions.value?.widths?.[field.field] || null, field: { - display: field.system.display, - displayOptions: field.system.display_options, - interface: field.system.interface, - interfaceOptions: field.system.options, + display: field.meta.display, + displayOptions: field.meta.display_options, + interface: field.meta.interface, + interfaceOptions: field.meta.options, type: field.type, field: field.field, }, @@ -524,11 +524,11 @@ export default defineComponent({ const field = availableFields.value.find((field) => field.field === fieldKey); if (field === undefined) return null; - if (!field.system.display) return null; + if (!field.meta.display) return null; return { - display: field.system.display, - options: field.system.display_options, + display: field.meta.display, + options: field.meta.display_options, }; } } diff --git a/app/src/modules/settings/routes/data-model/field-detail/components/relationship-o2m.vue b/app/src/modules/settings/routes/data-model/field-detail/components/relationship-o2m.vue index 1ebdf8ebaf..ebe79eed7f 100644 --- a/app/src/modules/settings/routes/data-model/field-detail/components/relationship-o2m.vue +++ b/app/src/modules/settings/routes/data-model/field-detail/components/relationship-o2m.vue @@ -87,7 +87,7 @@ export default defineComponent({ // Make sure the selected field matches the type of primary key of the current // collection. Otherwise you aren't able to properly save the primary key - if (!field.database || field.type !== currentCollectionPrimaryKey.value.type) return false; + if (!field.schema || field.type !== currentCollectionPrimaryKey.value.type) return false; return true; }) 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 835ea75ed8..9fd182bc31 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 @@ -52,8 +52,8 @@ function initLocalStore( state.fieldData.field = existingField.field; state.fieldData.type = existingField.type; - state.fieldData.database = existingField.database; - state.fieldData.system = existingField.system; + state.fieldData.database = existingField.schema; + state.fieldData.system = existingField.meta; state.relations = relationsStore.getRelationsForField(collection, field); } diff --git a/app/src/modules/settings/routes/data-model/fields/components/field-select/field-select.vue b/app/src/modules/settings/routes/data-model/fields/components/field-select/field-select.vue index 8327fae225..43f5a923d1 100644 --- a/app/src/modules/settings/routes/data-model/fields/components/field-select/field-select.vue +++ b/app/src/modules/settings/routes/data-model/fields/components/field-select/field-select.vue @@ -1,5 +1,5 @@