<template> <form @submit.prevent="submit"> <FormGroup :label="$t('createUserSourceForm.userSourceType')" :error="getError('type')" required small-label class="margin-bottom-2" > <Dropdown v-model="$v.values.type.$model" :show-search="false" class="user-source-settings__user-source-type" > <DropdownItem v-for="userSourceType in userSourceTypes" :key="userSourceType.type" :name="userSourceType.name" :value="userSourceType.type" :image="userSourceType.integrationType.image" /> </Dropdown> </FormGroup> <FormGroup :label="$t('createUserSourceForm.userSourceIntegration')" :error="getError('integration_id')" required small-label class="margin-bottom-2" > <IntegrationDropdown v-model="$v.values.integration_id.$model" :application="builder" :integrations="integrations" :integration-type="currentUserSourceType?.integrationType" /> </FormGroup> <FormGroup :error="getError('name')" :label="$t('createUserSourceForm.userSourceName')" required small-label > <FormInput v-model="$v.values.name.$model" size="large" :error="getError('name')" /> </FormGroup> <input type="submit" hidden /> </form> </template> <script> import form from '@baserow/modules/core/mixins/form' import IntegrationDropdown from '@baserow/modules/core/components/integrations/IntegrationDropdown' import { required, maxLength } from 'vuelidate/lib/validators' import { getNextAvailableNameInSequence } from '@baserow/modules/core/utils/string' export default { name: 'CreateUserSourceForm', components: { IntegrationDropdown }, mixins: [form], props: { builder: { type: Object, required: true, }, integrations: { type: Array, required: true, }, }, data() { return { values: { type: null, name: '', integration_id: null }, } }, computed: { userSources() { return this.$store.getters['userSource/getUserSources'](this.builder) }, userSourceTypes() { return Object.values(this.$registry.getOrderedList('userSource')) }, currentUserSourceType() { if (!this.values.type) { return null } else { return this.$registry.get('userSource', this.values.type) } }, userSourceNames() { return this.userSources.map(({ name }) => name) }, }, watch: { currentUserSourceType(newValue) { this.values.name = getNextAvailableNameInSequence( newValue.name, this.userSourceNames ) }, }, methods: { getError(fieldName) { if (!this.$v.values[fieldName].$dirty) { return false } const fieldState = this.$v.values[fieldName] if (!fieldState.required) { return this.$t('error.requiredField') } if (fieldName === 'name' && !fieldState.maxLength) { return this.$t('error.maxLength', { max: 255 }) } return false }, }, validations: { values: { type: { required, }, integration_id: { required, }, name: { required, maxLength: maxLength(255), }, }, }, } </script>