Fix validation of user configuration form fields
Closes #1562 (closed), #1564 (closed)
I found that removing all uses of configurationErrors from the template of FormFields.vue makes the problem disappear, while also making the component completely inoperative.
The configurationErrors is a computed property that was re-evaluated by Vue on any change, sometimes merely just clicking away from a field, and this computed property had side effects: it emitted events, and also called validateFields which could update the configuration data and emit moar events. Vue probably identified that configurationErrors depends on the configuration data, so this started causing a loop.
I removed this load-bearing computed entirely and replaced it with an errors data, which uses a different name just to make sure I really did not miss anything. Two watchers replace it, one on configuration and one on errors.
When errors is updated, the configuration-error event is emitted, to allow or deny submitting the whole form if the configuration is invalid.
When and only when the configuration is updated, it is validated and errors is updated. When there are no errors, the validated configuration is emitted as the modelValue for this component. This validated configuration may be different from the configuration data, because the validation functions might change it. For example, "2" would become 2 on an integer field. But because this component never does anything with the modelValue after mounting, we don't fall back into a loop.
This didn't completely work though, because the configuration watcher was not getting triggered properly. I ended up replacing the v-model on the generic <component /> with manual :model-value="" v-on:update:model-value="", which are equivalent but somehow trigger the configuration watcher more reliably.
At this point, I saw the exact same invisible fields as in #1564 (closed), but it happened almost every time when opening the configuration, and the entire form would be completely gone if there were no required fields at all. I used :model-value="configuration[key] ?? defaultConfiguration[key]" as a hack to get this to work again, as this will now use a default value automatically when the field is not defined at all. This is definitely a hack and points to much deeper problems in the entire configuration modal, but we are refactoring it soon anyway.