From c1a6eaed23133db4bcfb7886f37d415e42ee40f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20St=C5=99=C3=ADbn=C3=BD?= Date: Wed, 28 Jan 2026 11:12:54 +0100 Subject: [PATCH] Fix field mapping when importing CSV (#4521) --- .../bug/primary_key_change_import.json | 9 +++++++++ .../components/table/ImportFileModal.vue | 18 +++++++++++++++--- web-frontend/modules/database/store/field.js | 1 - 3 files changed, 24 insertions(+), 4 deletions(-) create mode 100644 changelog/entries/unreleased/bug/primary_key_change_import.json diff --git a/changelog/entries/unreleased/bug/primary_key_change_import.json b/changelog/entries/unreleased/bug/primary_key_change_import.json new file mode 100644 index 0000000000..5b7c0c612d --- /dev/null +++ b/changelog/entries/unreleased/bug/primary_key_change_import.json @@ -0,0 +1,9 @@ +{ + "type": "bug", + "message": "Fix field mapping when importing CSV", + "issue_origin": "github", + "issue_number": 3259, + "domain": "database", + "bullet_points": [], + "created_at": "2026-01-07" +} diff --git a/web-frontend/modules/database/components/table/ImportFileModal.vue b/web-frontend/modules/database/components/table/ImportFileModal.vue index c4cb751cce..9deec2f652 100644 --- a/web-frontend/modules/database/components/table/ImportFileModal.vue +++ b/web-frontend/modules/database/components/table/ImportFileModal.vue @@ -98,7 +98,7 @@ @@ -245,6 +245,18 @@ export default { } }, computed: { + sortedFields() { + // The sort needs to follow the same sort logic as + // RowHandler.import_rows(...) in the backend + return [...this.fields].sort((a, b) => { + const aPrimary = !!a.primary + const bPrimary = !!b.primary + if (aPrimary !== bPrimary) return aPrimary ? -1 : 1 + const orderDiff = (a.order ?? 0) - (b.order ?? 0) + if (orderDiff !== 0) return orderDiff + return a.id - b.id + }) + }, isTableCreated() { if (!this.job?.table_id) { return false @@ -281,7 +293,7 @@ export default { * All writable fields. */ writableFields() { - return this.fields.filter((field) => + return this.sortedFields.filter((field) => this.fieldTypes[field.type].canWriteFieldValues(field) ) }, @@ -353,7 +365,7 @@ export default { }, availableUpsertFields() { const selected = Object.values(this.mapping) - return this.fields.filter((field) => { + return this.sortedFields.filter((field) => { return ( selected.includes(field.id) && this.fieldTypes[field.type].canUpsert() ) diff --git a/web-frontend/modules/database/store/field.js b/web-frontend/modules/database/store/field.js index 68883af524..9144f673b7 100644 --- a/web-frontend/modules/database/store/field.js +++ b/web-frontend/modules/database/store/field.js @@ -264,7 +264,6 @@ export const actions = { const fieldType = $registry.get('field', data.type) data = populateField(data, $registry) - commit('UPDATE_ITEM', { id: field.id, values: data }) commit('UPDATE_ITEM', { id: field.id, values: data }) // The view might need to do some cleanup regarding the filters and sortings if the