diff --git a/core/client/components/form/KForm.vue b/core/client/components/form/KForm.vue index 8ce8c0571..8afc02f5c 100644 --- a/core/client/components/form/KForm.vue +++ b/core/client/components/form/KForm.vue @@ -187,7 +187,17 @@ async function build () { // clone and configure the field const cloneField = _.clone(field) cloneField.name = property // assign a name to allow binding between properties and fields - cloneField.component = loadComponent(field.field.component) + let component = _.get(field.field, 'component', '') + if (!component) { + // Provide a default component based on schema value type when none is specified + if (field.type === 'number' || field.type === 'integer') + component = 'form/KNumberField' + else if (field.type === 'boolean') + component = 'form/KToggleField' + else if (field.type === 'string') + component = 'form/KTextField' + } + cloneField.component = loadComponent(component) cloneField.reference = null // will be set once te field is rendered cloneField.required = _.includes(schema.value.required, property) // add extra required info // add the field to the list of fields to be rendered diff --git a/core/client/mixins/mixin.base-field.js b/core/client/mixins/mixin.base-field.js index c018fecde..86e8121a0 100644 --- a/core/client/mixins/mixin.base-field.js +++ b/core/client/mixins/mixin.base-field.js @@ -22,7 +22,10 @@ export const baseField = { }, computed: { label () { - return this.$tie(_.get(this.properties.field, 'label', '')) + // Make use of 'description' metadata if nothing else is provided + // cf. https://ajv.js.org/json-schema.html#metadata-keywords + const description = _.get(this.properties, 'description', '') + return this.$tie(_.get(this.properties.field, 'label', description)) }, hasHelper () { return !_.isEmpty(_.get(this.properties.field, 'helper', {})) diff --git a/map/client/components/KFeatureEditor.vue b/map/client/components/KFeatureEditor.vue index 08ed770e1..7dc11efb7 100644 --- a/map/client/components/KFeatureEditor.vue +++ b/map/client/components/KFeatureEditor.vue @@ -66,8 +66,8 @@ export default { await this.$api.getService(this.service).patch(updatedFeature._id, _.pick(updatedFeature, ['properties'])) } }, - async loadLayerSchema () { - return updatePropertiesSchema(_.get(this.layer, 'schema.content')) + loadLayerSchema () { + return _.get(this.layer, 'schema.content') }, async openModal () { kCoreMixins.baseModal.methods.openModal.call(this) diff --git a/map/client/utils/utils.schema.js b/map/client/utils/utils.schema.js index 87fc249ec..9b12ceb84 100644 --- a/map/client/utils/utils.schema.js +++ b/map/client/utils/utils.schema.js @@ -44,31 +44,3 @@ export function generatePropertiesSchema (geoJson, name) { }) return schema } - -export function updatePropertiesSchema (schema) { - const props = schema.properties - if (!props) return - - const bestGuesses = { - undefined: 'form/KTextField', - object: 'form/KTextField', - string: 'form/KTextField', - number: 'form/KNumberField', - boolean: 'form/KToggleField' - } - - // Loop over declared props and add best guesses to field components based on property type - for (const prop in props) { - const propEntry = props[prop] - // Field already here, skip entry - if (propEntry.field && propEntry.field.component) continue - - propEntry.field = { - component: bestGuesses[propEntry.type], - label: prop, - helper: propEntry.description - } - } - - return schema -}