Skip to content

Commit ad6d03c

Browse files
authored
Fix form default value at first render (baserow#4274)
* Fix form data initialisation during SSR * Fix missing automation error
1 parent dd4b7bd commit ad6d03c

File tree

13 files changed

+149
-312
lines changed

13 files changed

+149
-312
lines changed
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"type": "refactor",
3+
"message": "Fix missing form data after first render (SSR)",
4+
"issue_origin": "github",
5+
"issue_number": 4268,
6+
"domain": "builder",
7+
"bullet_points": [],
8+
"created_at": "2025-11-17"
9+
}

enterprise/web-frontend/modules/baserow_enterprise/builder/components/elements/FileInputElement.vue

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -62,12 +62,6 @@ export default {
6262
resolvedLabel() {
6363
return ensureString(this.resolveFormula(this.element.label))
6464
},
65-
resolvedDefaultValue() {
66-
return this.elementType.getInitialFormDataValue(
67-
this.element,
68-
this.applicationContext
69-
)
70-
},
7165
allowedExtensions() {
7266
return this.element.allowed_filetypes
7367
.filter((v) => v)
@@ -121,6 +115,8 @@ export default {
121115
},
122116
},
123117
watch: {
118+
// override the default mixin method because we want to use the one with metadata
119+
resolvedDefaultValue() {},
124120
resolvedDefaultValueWithMetadata: {
125121
handler(value) {
126122
if (process.client) {

enterprise/web-frontend/modules/baserow_enterprise/builder/components/elements/FileInputElementForm.vue

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -171,10 +171,10 @@ export default {
171171
data() {
172172
return {
173173
values: {
174-
label: '',
175-
default_name: '',
176-
default_url: '',
177-
help_text: '',
174+
label: {},
175+
default_name: {},
176+
default_url: {},
177+
help_text: {},
178178
required: false,
179179
multiple: false,
180180
max_filesize: 5,

web-frontend/modules/automation/pages/automationWorkflow.vue

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ import WorkflowEditor from '@baserow/modules/automation/components/workflow/Work
4848
import EditorSidePanels from '@baserow/modules/automation/components/workflow/EditorSidePanels'
4949
import { AutomationApplicationType } from '@baserow/modules/automation/applicationTypes'
5050
import { notifyIf } from '@baserow/modules/core/utils/error'
51+
import { StoreItemLookupError } from '@baserow/modules/core/errors'
5152
5253
export default {
5354
name: 'AutomationWorkflow',
@@ -227,11 +228,12 @@ export default {
227228
parseInt(from.params.automationId)
228229
)
229230
if (automation) {
230-
const workflow = this.$store.getters['automationWorkflow/getById'](
231-
automation,
232-
parseInt(from.params.workflowId)
233-
)
234-
if (workflow) {
231+
try {
232+
const workflow = this.$store.getters['automationWorkflow/getById'](
233+
automation,
234+
parseInt(from.params.workflowId)
235+
)
236+
235237
this.$store.dispatch('automationWorkflowNode/select', {
236238
workflow,
237239
node: null,
@@ -240,6 +242,10 @@ export default {
240242
application: automation,
241243
data: { _loadedOnce: false },
242244
})
245+
} catch (e) {
246+
if (!(e instanceof StoreItemLookupError)) {
247+
throw e
248+
}
243249
}
244250
}
245251
next()

web-frontend/modules/builder/components/elements/components/CheckboxElement.vue

Lines changed: 1 addition & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -20,33 +20,15 @@
2020

2121
<script>
2222
import formElement from '@baserow/modules/builder/mixins/formElement'
23-
import {
24-
ensureBoolean,
25-
ensureString,
26-
} from '@baserow/modules/core/utils/validator'
23+
import { ensureString } from '@baserow/modules/core/utils/validator'
2724
2825
export default {
2926
name: 'CheckboxElement',
3027
mixins: [formElement],
3128
computed: {
32-
defaultValueResolved() {
33-
try {
34-
return ensureBoolean(this.resolveFormula(this.element.default_value))
35-
} catch {
36-
return false
37-
}
38-
},
3929
resolvedLabel() {
4030
return ensureString(this.resolveFormula(this.element.label))
4131
},
4232
},
43-
watch: {
44-
defaultValueResolved: {
45-
handler(newValue) {
46-
this.inputValue = newValue
47-
},
48-
immediate: true,
49-
},
50-
},
5133
}
5234
</script>

web-frontend/modules/builder/components/elements/components/ChoiceElement.vue

Lines changed: 6 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -57,13 +57,7 @@
5757

5858
<script>
5959
import formElement from '@baserow/modules/builder/mixins/formElement'
60-
import {
61-
ensureString,
62-
ensureStringOrInteger,
63-
ensureArray,
64-
ensurePositiveInteger,
65-
} from '@baserow/modules/core/utils/validator'
66-
import { CHOICE_OPTION_TYPES } from '@baserow/modules/builder/enums'
60+
import { ensureString } from '@baserow/modules/core/utils/validator'
6761
6862
export default {
6963
name: 'ChoiceElement',
@@ -94,78 +88,19 @@ export default {
9488
placeholderResolved() {
9589
return ensureString(this.resolveFormula(this.element.placeholder))
9690
},
97-
defaultValueResolved() {
98-
let converter = ensureString
99-
if (
100-
this.optionsResolved.find(
101-
({ value }) => value !== undefined && value !== null // We skip null values
102-
) &&
103-
Number.isInteger(this.optionsResolved[0].value)
104-
) {
105-
converter = (v) => ensurePositiveInteger(v, { allowNull: true })
106-
}
107-
if (this.element.multiple) {
108-
try {
109-
const existingValues = this.optionsResolved.map(({ value }) => value)
110-
return ensureArray(this.resolveFormula(this.element.default_value))
111-
.map(converter)
112-
.filter((value) => existingValues.includes(value))
113-
} catch {
114-
return []
115-
}
116-
} else {
117-
try {
118-
// Always return a string if we have a default value, otherwise
119-
// set the value to null as single select fields will only skip
120-
// field preparation if the value is null.
121-
const resolvedSingleValue = converter(
122-
this.resolveFormula(this.element.default_value)
123-
)
124-
return resolvedSingleValue === '' ? null : resolvedSingleValue
125-
} catch {
126-
return null
127-
}
128-
}
129-
},
13091
canHaveOptions() {
13192
return !this.elementIsInError
13293
},
13394
optionsResolved() {
134-
switch (this.element.option_type) {
135-
case CHOICE_OPTION_TYPES.MANUAL:
136-
return this.element.options.map(({ name, value }) => ({
137-
name,
138-
value: value === null ? name : value,
139-
}))
140-
case CHOICE_OPTION_TYPES.FORMULAS: {
141-
const formulaValues = ensureArray(
142-
this.resolveFormula(this.element.formula_value)
143-
)
144-
const formulaNames = ensureArray(
145-
this.resolveFormula(this.element.formula_name)
146-
)
147-
return formulaValues.map((value, index) => ({
148-
id: index,
149-
value: ensureStringOrInteger(value),
150-
name: ensureString(
151-
index < formulaValues.length ? formulaNames[index] : value
152-
),
153-
}))
154-
}
155-
default:
156-
return []
157-
}
95+
return this.elementType.getOptionsResolved(
96+
this.element,
97+
this.applicationContext
98+
)
15899
},
159100
},
160101
watch: {
161-
defaultValueResolved: {
162-
handler(newValue) {
163-
this.inputValue = newValue
164-
},
165-
immediate: true,
166-
},
167102
'element.multiple'() {
168-
this.setFormData(this.defaultValueResolved)
103+
this.setFormData(this.resolvedDefaultValue)
169104
},
170105
},
171106
methods: {

web-frontend/modules/builder/components/elements/components/DateTimePickerElement.vue

Lines changed: 1 addition & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,7 @@
2121
import formElement from '@baserow/modules/builder/mixins/formElement'
2222
import ABDateTimePicker from '@baserow/modules/builder/components/elements/baseComponents/ABDateTimePicker.vue'
2323
import { DATE_FORMATS, TIME_FORMATS } from '@baserow/modules/builder/enums'
24-
import {
25-
ensureDateTime,
26-
ensureDate,
27-
ensureString,
28-
} from '@baserow/modules/core/utils/validator'
24+
import { ensureString } from '@baserow/modules/core/utils/validator'
2925
3026
export default {
3127
name: 'DateTimePickerElement',
@@ -52,41 +48,10 @@ export default {
5248
DATE_FORMATS() {
5349
return DATE_FORMATS
5450
},
55-
resolvedDefaultValue() {
56-
const resolvedFormula = this.resolveFormula(this.element.default_value)
57-
58-
if (!resolvedFormula) {
59-
return null
60-
}
61-
62-
try {
63-
const result = this.element.include_time
64-
? ensureDateTime(resolvedFormula)
65-
: ensureDate(resolvedFormula)
66-
67-
if (result && !isNaN(result)) {
68-
// We convert to an iso string here because date objects are not serialized
69-
// properly during SSR
70-
return result.toJSON()
71-
} else {
72-
return result
73-
}
74-
} catch (e) {
75-
return null
76-
}
77-
},
7851
resolvedLabel() {
7952
return ensureString(this.resolveFormula(this.element.label))
8053
},
8154
},
82-
watch: {
83-
resolvedDefaultValue: {
84-
handler(value) {
85-
this.setFormData(value)
86-
},
87-
immediate: true,
88-
},
89-
},
9055
methods: {
9156
getErrorMessage() {
9257
if (this.inputValue) {

web-frontend/modules/builder/components/elements/components/InputTextElement.vue

Lines changed: 7 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -60,17 +60,6 @@ export default {
6060
localeLanguage() {
6161
return this.$i18n.locale
6262
},
63-
resolvedDefaultValue() {
64-
try {
65-
const value = this.resolveFormula(this.element.default_value)
66-
67-
return this.isNumericField
68-
? ensureNumeric(value, { allowNull: true })
69-
: ensureString(value)
70-
} catch {
71-
return null
72-
}
73-
},
7463
isNumericField() {
7564
return this.element.validation_type === 'integer'
7665
},
@@ -82,20 +71,16 @@ export default {
8271
},
8372
},
8473
watch: {
85-
resolvedDefaultValue: {
86-
handler(value) {
87-
this.inputValue = value
88-
this.internalValue = this.toInternalValue(value)
74+
inputValue: {
75+
handler(newValue) {
76+
// If the inputValue was updated (after a reset for instance) we want to update
77+
// the internal value
78+
if (this.fromInternalValue(this.internalValue) !== newValue) {
79+
this.internalValue = this.toInternalValue(newValue)
80+
}
8981
},
9082
immediate: true,
9183
},
92-
inputValue(newValue) {
93-
// If the inputValue was updated (after a reset for instance) we want to update
94-
// the internal value
95-
if (this.fromInternalValue(this.internalValue) !== newValue) {
96-
this.internalValue = this.toInternalValue(newValue)
97-
}
98-
},
9984
},
10085
methods: {
10186
toInternalValue(value) {

web-frontend/modules/builder/components/elements/components/RatingElement.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,15 @@
1212

1313
<script>
1414
import Rating from '@baserow/modules/database/components/Rating'
15-
import formElement from '@baserow/modules/builder/mixins/formElement'
15+
import element from '@baserow/modules/builder/mixins/element'
1616
import { ensurePositiveInteger } from '@baserow/modules/core/utils/validator'
1717
1818
export default {
1919
name: 'RatingElement',
2020
components: {
2121
Rating,
2222
},
23-
mixins: [formElement],
23+
mixins: [element],
2424
computed: {
2525
resolvedValue() {
2626
try {

web-frontend/modules/builder/components/elements/components/RatingInputElement.vue

Lines changed: 1 addition & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,7 @@
1818
<script>
1919
import Rating from '@baserow/modules/database/components/Rating'
2020
import formElement from '@baserow/modules/builder/mixins/formElement'
21-
import {
22-
ensurePositiveInteger,
23-
ensureString,
24-
} from '@baserow/modules/core/utils/validator'
21+
import { ensureString } from '@baserow/modules/core/utils/validator'
2522
import { useVuelidate } from '@vuelidate/core'
2623
import { required } from '@vuelidate/validators'
2724
@@ -35,13 +32,6 @@ export default {
3532
return { v$: useVuelidate() }
3633
},
3734
computed: {
38-
resolvedDefaultValue() {
39-
try {
40-
return ensurePositiveInteger(this.resolveFormula(this.element.value))
41-
} catch {
42-
return 0
43-
}
44-
},
4535
labelResolved() {
4636
return ensureString(this.resolveFormula(this.element.label))
4737
},
@@ -53,14 +43,6 @@ export default {
5343
}
5444
},
5545
},
56-
watch: {
57-
resolvedDefaultValue: {
58-
handler(value) {
59-
this.inputValue = value
60-
},
61-
immediate: true,
62-
},
63-
},
6446
validations() {
6547
return this.rules
6648
},

0 commit comments

Comments
 (0)