1
0
Fork 0
mirror of https://gitlab.com/bramw/baserow.git synced 2025-02-14 08:58:56 +00:00
bramw_baserow/web-frontend/modules/database/components/table/CreateDataSync.vue
2024-12-11 22:54:44 +00:00

166 lines
4.5 KiB
Vue

<template>
<div v-if="!loadedProperties">
<TableForm
ref="tableForm"
class="margin-top-3 margin-bottom-2"
:default-name="getDefaultName()"
@submitted="submitted"
>
<component :is="dataSyncComponent" :disabled="loadingProperties" />
</TableForm>
<Error :error="error"></Error>
<div class="align-right">
<Button
type="primary"
size="large"
:disabled="loadingProperties"
:loading="loadingProperties"
@click="$refs.tableForm.submit()"
>
{{ $t('createDataSync.next') }}
</Button>
</div>
</div>
<div v-else>
<FormGroup small-label class="margin-top-3">
<template #label> {{ $t('createDataSync.fields') }}</template>
<SwitchInput
v-for="property in orderedProperties"
:key="property.key"
class="margin-top-2"
small
:value="syncedProperties.includes(property.key)"
:disabled="property.unique_primary || jobIsRunning || jobHasSucceeded"
@input="toggleVisibleField(property.key)"
>
<i :class="getFieldTypeIconClass(property.field_type)"></i>
{{ property.name }}</SwitchInput
>
</FormGroup>
<Error :error="error"></Error>
<div class="modal-progress__actions margin-top-2">
<ProgressBar
v-if="jobIsRunning || jobHasSucceeded"
:value="job.progress_percentage"
:status="jobHumanReadableState"
/>
<div class="align-right">
<Button
type="primary"
size="large"
:disabled="creatingTable || jobIsRunning || jobHasSucceeded"
:loading="creatingTable || jobIsRunning || jobHasSucceeded"
@click="create"
>
{{ $t('createDataSync.create') }}
</Button>
</div>
</div>
</div>
</template>
<script>
import TableForm from '@baserow/modules/database/components/table/TableForm'
import { getNextAvailableNameInSequence } from '@baserow/modules/core/utils/string'
import DataSyncService from '@baserow/modules/database/services/dataSync'
import { clone } from '@baserow/modules/core/utils/object'
import dataSync from '@baserow/modules/database/mixins/dataSync'
export default {
name: 'CreateDataSync',
components: { TableForm },
mixins: [dataSync],
props: {
database: {
type: Object,
required: true,
},
chosenType: {
type: String,
required: true,
},
},
data() {
return {
formValues: null,
properties: null,
creatingTable: false,
createdTable: null,
}
},
computed: {
dataSyncComponent() {
return this.chosenType === ''
? null
: this.$registry.get('dataSync', this.chosenType).getFormComponent()
},
},
watch: {
chosenType(newValue, oldValue) {
if (newValue !== oldValue) {
this.hideError()
this.loadedProperties = false
this.loadingProperties = false
this.formValues = null
this.properties = null
this.syncedProperties = null
this.creatingTable = false
this.createdTable = null
}
},
},
methods: {
hide() {
this.stopPollIfRunning()
},
getDefaultName() {
const excludeNames = this.database.tables.map((table) => table.name)
const baseName = this.$t('createTableModal.defaultName')
return getNextAvailableNameInSequence(baseName, excludeNames)
},
async submitted(formValues) {
this.formValues = formValues
await this.fetchNonExistingProperties(this.chosenType, formValues)
},
async create() {
this.hideError()
this.job = null
this.uploadProgressPercentage = 0
const formValues = clone(this.formValues)
formValues.table_name = formValues.name
formValues.synced_properties = this.syncedProperties
this.creatingTable = true
this.hideError()
try {
const { data } = await DataSyncService(this.$client).create(
this.database.id,
formValues
)
this.createdTable = data
await this.$store.dispatch('table/forceUpsert', {
database: this.database,
data: this.createdTable,
})
await this.syncTable(this.createdTable)
} catch (error) {
this.handleError(error)
} finally {
this.creatingTable = false
}
},
async onJobDone() {
await this.$nuxt.$router.push({
name: 'database-table',
params: {
databaseId: this.database.id,
tableId: this.createdTable.id,
},
})
this.$emit('hide')
},
},
}
</script>