diff --git a/src/lang/en-US/index.json b/src/lang/en-US/index.json index 003342a731..b7d5582180 100644 --- a/src/lang/en-US/index.json +++ b/src/lang/en-US/index.json @@ -51,8 +51,13 @@ "not_available_for_type": "Not Available for this Type", "configure_m2o": "Configure your Many-to-One Relationship...", + "configure_o2m": "Configure your One-to-Many Relationship...", "configure_m2m": "Configure your Many-to-Many Relationship...", + "add_m2o_to_collection": "Add Many-to-One to \"{collection}\"", + "add_o2m_to_collection": "Add One-to-Many to \"{collection}\"", + "add_m2m_to_collection": "Add Many-to-Many to \"{collection}\"", + "choose_a_type": "Choose a Type...", "determined_by_relationship": "Determined by Relationship", diff --git a/src/modules/settings/routes/data-model/field-detail/components/relationship-m2o.vue b/src/modules/settings/routes/data-model/field-detail/components/relationship-m2o.vue index 15ff9902b1..1d5bbde11c 100644 --- a/src/modules/settings/routes/data-model/field-detail/components/relationship-m2o.vue +++ b/src/modules/settings/routes/data-model/field-detail/components/relationship-m2o.vue @@ -24,7 +24,7 @@
{{ $t('create_corresponding_field') }}
- +
{{ $t('corresponding_field_name') }}
@@ -43,6 +43,7 @@ import { orderBy } from 'lodash'; import useSync from '@/composables/use-sync'; import useCollectionsStore from '@/stores/collections'; import useFieldsStore from '@/stores/fields'; +import i18n from '@/lang'; export default defineComponent({ props: { @@ -75,9 +76,17 @@ export default defineComponent({ const fieldsStore = useFieldsStore(); const { items, relatedPrimary } = useRelation(); - const { hasCorresponding, correspondingField } = useCorresponding(); + const { hasCorresponding, correspondingField, correspondingLabel } = useCorresponding(); - return { _relations, _newFields, items, relatedPrimary, hasCorresponding, correspondingField }; + return { + _relations, + _newFields, + items, + relatedPrimary, + hasCorresponding, + correspondingField, + correspondingLabel, + }; function useRelation() { const availableCollections = computed(() => { @@ -132,21 +141,6 @@ export default defineComponent({ }, }); - watch( - () => _relations.value[0].collection_one, - () => { - if (hasCorresponding.value === true) { - _newFields.value = [ - { - ...(_newFields.value[0] || {}), - collection: _relations.value[0].collection_one, - }, - ]; - } - }, - { immediate: true } - ); - const correspondingField = computed({ get() { return _newFields.value?.[0]?.field || null; @@ -168,7 +162,15 @@ export default defineComponent({ }, }); - return { hasCorresponding, correspondingField }; + const correspondingLabel = computed(() => { + if (_relations.value[0].collection_one) { + return i18n.t('add_o2m_to_collection', { collection: _relations.value[0].collection_one }); + } + + return i18n.t('add_field_related'); + }); + + return { hasCorresponding, correspondingField, correspondingLabel }; } }, }); diff --git a/src/modules/settings/routes/data-model/field-detail/components/relationship-o2m.vue b/src/modules/settings/routes/data-model/field-detail/components/relationship-o2m.vue index 8b242c6d3a..70f3c289c9 100644 --- a/src/modules/settings/routes/data-model/field-detail/components/relationship-o2m.vue +++ b/src/modules/settings/routes/data-model/field-detail/components/relationship-o2m.vue @@ -1,9 +1,181 @@ + + diff --git a/src/modules/settings/routes/data-model/field-detail/field-detail.vue b/src/modules/settings/routes/data-model/field-detail/field-detail.vue index e8315eaa93..a6c64bd525 100644 --- a/src/modules/settings/routes/data-model/field-detail/field-detail.vue +++ b/src/modules/settings/routes/data-model/field-detail/field-detail.vue @@ -60,6 +60,7 @@ import api from '@/api'; import { Relation } from '@/stores/relations/types'; import { useFieldsStore } from '@/stores/fields'; import { Field } from '@/stores/fields/types'; +import router from '@/router'; export default defineComponent({ components: { @@ -244,11 +245,56 @@ export default defineComponent({ fieldData.database.type = field.database.type; } ); + + watch( + () => relations.value[0].collection_one, + () => { + if (newFields.value.length > 0) { + newFields.value[0].collection = relations.value[0].collection_one; + } + } + ); + } + + if (props.type === 'o2m') { + delete fieldData.database; + + fieldData.system.special = 'o2m'; + + relations.value = [ + { + collection_many: '', + field_many: '', + primary_many: '', + + collection_one: props.collection, + field_one: fieldData.field, + primary_one: fieldsStore.getPrimaryKeyFieldForCollection(props.collection)?.field, + }, + ]; + + watch( + () => fieldData.field, + () => { + relations.value[0].field_one = fieldData.field; + } + ); + + watch( + () => relations.value[0].collection_many, + () => { + relations.value[0].primary_many = fieldsStore.getPrimaryKeyFieldForCollection( + relations.value[0].collection_many + ).field; + } + ); } if (props.type === 'm2m' || props.type === 'files') { delete fieldData.database; + fieldData.system.special = 'm2m'; + relations.value = [ { collection_many: '', @@ -319,6 +365,8 @@ export default defineComponent({ ); await api.post(`/relations`, relations.value); + + router.push(`/settings/data-model/${props.collection}`); } catch (error) { console.error(error); } finally {