mirror of
https://github.com/directus/directus.git
synced 2026-04-25 03:00:53 -04:00
add type field to repeater
This commit is contained in:
@@ -1,5 +1,9 @@
|
||||
<template>
|
||||
<v-notice v-if="selectedType === undefined">
|
||||
{{ $t('select_field_type') }}
|
||||
</v-notice>
|
||||
<v-select
|
||||
v-else
|
||||
:items="items"
|
||||
@input="$listeners.input"
|
||||
:value="value"
|
||||
@@ -8,9 +12,10 @@
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { defineComponent, computed } from '@vue/composition-api';
|
||||
import { defineComponent, computed, PropType, inject, ref } from '@vue/composition-api';
|
||||
import i18n from '@/lang';
|
||||
import { getInterfaces } from '@/interfaces';
|
||||
import { types } from '@/types';
|
||||
|
||||
export default defineComponent({
|
||||
props: {
|
||||
@@ -18,13 +23,24 @@ export default defineComponent({
|
||||
type: String,
|
||||
default: null,
|
||||
},
|
||||
typeField: {
|
||||
type: String,
|
||||
default: null
|
||||
}
|
||||
},
|
||||
setup() {
|
||||
setup(props) {
|
||||
const interfaces = getInterfaces();
|
||||
|
||||
const selectedType = computed(() => {
|
||||
const values = inject('values', ref<Record<string, any>>({}));
|
||||
if (props.typeField === null || !values.value[props.typeField]) return;
|
||||
return values.value[props.typeField]
|
||||
});
|
||||
|
||||
const items = computed(() => {
|
||||
return interfaces.value
|
||||
.filter((inter) => inter.relationship === undefined && inter.system !== true)
|
||||
.filter((inter) => selectedType.value === undefined || inter.types.includes(selectedType.value))
|
||||
.map((inter) => {
|
||||
return {
|
||||
text: inter.name,
|
||||
@@ -33,7 +49,7 @@ export default defineComponent({
|
||||
});
|
||||
});
|
||||
|
||||
return { items };
|
||||
return { items, selectedType };
|
||||
},
|
||||
});
|
||||
</script>
|
||||
|
||||
@@ -22,6 +22,7 @@ import { defineComponent, PropType, computed } from '@vue/composition-api';
|
||||
import Repeater from './repeater.vue';
|
||||
import { Field, FieldMeta } from '@/types';
|
||||
import i18n from '@/lang';
|
||||
import { fieldTypes } from '@/modules/settings/routes/data-model/field-detail/components/schema.vue';
|
||||
|
||||
export default defineComponent({
|
||||
components: { Repeater },
|
||||
@@ -36,10 +37,11 @@ export default defineComponent({
|
||||
get() {
|
||||
return props.value?.fields?.map((field: Field) => field.meta);
|
||||
},
|
||||
set(newVal: FieldMeta[]) {
|
||||
const fields = newVal.map((meta) => ({
|
||||
set(newVal: FieldMeta[] | null) {
|
||||
const fields = (newVal || []).map((meta: Record<string, any>) => ({
|
||||
field: meta.field,
|
||||
name: meta.field,
|
||||
type: meta.type,
|
||||
meta,
|
||||
}));
|
||||
|
||||
@@ -89,6 +91,22 @@ export default defineComponent({
|
||||
},
|
||||
schema: null,
|
||||
},
|
||||
{
|
||||
name: i18n.t('type'),
|
||||
field: 'type',
|
||||
type: 'string',
|
||||
meta: {
|
||||
interface: 'dropdown',
|
||||
width: 'half',
|
||||
sort: 3,
|
||||
options: {
|
||||
choices: fieldTypes
|
||||
}
|
||||
},
|
||||
schema: {
|
||||
default_value: 'string'
|
||||
},
|
||||
},
|
||||
{
|
||||
name: i18n.t('interface'),
|
||||
field: 'interface',
|
||||
@@ -96,7 +114,10 @@ export default defineComponent({
|
||||
meta: {
|
||||
interface: 'interface',
|
||||
width: 'half',
|
||||
sort: 3,
|
||||
sort: 4,
|
||||
options: {
|
||||
typeField: 'type'
|
||||
}
|
||||
},
|
||||
schema: null,
|
||||
},
|
||||
@@ -106,8 +127,8 @@ export default defineComponent({
|
||||
type: 'string',
|
||||
meta: {
|
||||
interface: 'text-input',
|
||||
width: 'half',
|
||||
sort: 4,
|
||||
width: 'full',
|
||||
sort: 5,
|
||||
options: {
|
||||
placeholder: i18n.t('interfaces.repeater.field_note_placeholder'),
|
||||
},
|
||||
@@ -121,7 +142,7 @@ export default defineComponent({
|
||||
meta: {
|
||||
interface: 'interface-options',
|
||||
width: 'full',
|
||||
sort: 5,
|
||||
sort: 6,
|
||||
options: {
|
||||
interfaceField: 'interface',
|
||||
},
|
||||
|
||||
@@ -1337,6 +1337,7 @@
|
||||
"select_existing": "Select Existing",
|
||||
"select_field": "Select a Field",
|
||||
"select_from_device": "Select from device",
|
||||
"select_field_type": "Select a field type",
|
||||
"select_interface": "Select an interface",
|
||||
"select_interface_below": "Select an interface below",
|
||||
"select_statuses_copy": "Select the statuses the user can use",
|
||||
|
||||
@@ -176,6 +176,69 @@ import { types } from '@/types';
|
||||
import i18n from '@/lang';
|
||||
import { state } from '../store';
|
||||
|
||||
export const fieldTypes = [
|
||||
{
|
||||
text: i18n.t('string'),
|
||||
value: 'string',
|
||||
},
|
||||
{
|
||||
text: i18n.t('text'),
|
||||
value: 'text',
|
||||
},
|
||||
{ divider: true },
|
||||
{
|
||||
text: i18n.t('boolean'),
|
||||
value: 'boolean',
|
||||
},
|
||||
{ divider: true },
|
||||
{
|
||||
text: i18n.t('integer'),
|
||||
value: 'integer',
|
||||
},
|
||||
{
|
||||
text: i18n.t('bigInteger'),
|
||||
value: 'bigInteger',
|
||||
},
|
||||
{
|
||||
text: i18n.t('float'),
|
||||
value: 'float',
|
||||
},
|
||||
{
|
||||
text: i18n.t('decimal'),
|
||||
value: 'decimal',
|
||||
},
|
||||
{ divider: true },
|
||||
{
|
||||
text: i18n.t('timestamp'),
|
||||
value: 'timestamp',
|
||||
},
|
||||
{
|
||||
text: i18n.t('datetime'),
|
||||
value: 'dateTime',
|
||||
},
|
||||
{
|
||||
text: i18n.t('date'),
|
||||
value: 'date',
|
||||
},
|
||||
{
|
||||
text: i18n.t('time'),
|
||||
value: 'time',
|
||||
},
|
||||
{ divider: true },
|
||||
{
|
||||
text: i18n.t('json'),
|
||||
value: 'json',
|
||||
},
|
||||
{
|
||||
text: i18n.t('csv'),
|
||||
value: 'csv',
|
||||
},
|
||||
{
|
||||
text: i18n.t('uuid'),
|
||||
value: 'uuid',
|
||||
},
|
||||
];
|
||||
|
||||
export default defineComponent({
|
||||
props: {
|
||||
isExisting: {
|
||||
@@ -189,68 +252,7 @@ export default defineComponent({
|
||||
},
|
||||
setup(props, { emit }) {
|
||||
const typesWithLabels = computed(() => {
|
||||
return [
|
||||
{
|
||||
text: i18n.t('string'),
|
||||
value: 'string',
|
||||
},
|
||||
{
|
||||
text: i18n.t('text'),
|
||||
value: 'text',
|
||||
},
|
||||
{ divider: true },
|
||||
{
|
||||
text: i18n.t('boolean'),
|
||||
value: 'boolean',
|
||||
},
|
||||
{ divider: true },
|
||||
{
|
||||
text: i18n.t('integer'),
|
||||
value: 'integer',
|
||||
},
|
||||
{
|
||||
text: i18n.t('bigInteger'),
|
||||
value: 'bigInteger',
|
||||
},
|
||||
{
|
||||
text: i18n.t('float'),
|
||||
value: 'float',
|
||||
},
|
||||
{
|
||||
text: i18n.t('decimal'),
|
||||
value: 'decimal',
|
||||
},
|
||||
{ divider: true },
|
||||
{
|
||||
text: i18n.t('timestamp'),
|
||||
value: 'timestamp',
|
||||
},
|
||||
{
|
||||
text: i18n.t('datetime'),
|
||||
value: 'dateTime',
|
||||
},
|
||||
{
|
||||
text: i18n.t('date'),
|
||||
value: 'date',
|
||||
},
|
||||
{
|
||||
text: i18n.t('time'),
|
||||
value: 'time',
|
||||
},
|
||||
{ divider: true },
|
||||
{
|
||||
text: i18n.t('json'),
|
||||
value: 'json',
|
||||
},
|
||||
{
|
||||
text: i18n.t('csv'),
|
||||
value: 'csv',
|
||||
},
|
||||
{
|
||||
text: i18n.t('uuid'),
|
||||
value: 'uuid',
|
||||
},
|
||||
];
|
||||
return fieldTypes
|
||||
});
|
||||
|
||||
const typeDisabled = computed(() => {
|
||||
|
||||
Reference in New Issue
Block a user