From daf0eaa44ceb20357cb4559893c8b379c0620503 Mon Sep 17 00:00:00 2001 From: volterra79 Date: Fri, 6 Sep 2024 09:13:58 +0200 Subject: [PATCH 01/12] :bug: Fix validation of input not required --- src/app/gui/inputs/service.js | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/src/app/gui/inputs/service.js b/src/app/gui/inputs/service.js index 9279ecd39..2816b9cb9 100644 --- a/src/app/gui/inputs/service.js +++ b/src/app/gui/inputs/service.js @@ -91,29 +91,24 @@ proto.setEmpty = function(){ // the general method to check the value of the state is valid or not proto.validate = function() { - if (this.state.validate.empty) { - this.state.validate.empty = true; - this.state.value = null; - this.state.validate.unique = true; - // check if you require or check validation - this.state.validate.valid = this.state.validate.required ? false : this._validator.validate(this.state.value); - } else { - if (['integer', 'float'].includes(this.state.input.type)) { - if (+this.state.value < 0) { - this.state.value = null; - this.state.validate.empty = true; - this.state.validate.valid = !this.state.validate.required; - } else this.state.validate.valid = this._validator.validate(this.state.value); - } + //check if input is not required (empty === true) and the value is not empty + if (!(this.state.validate.empty && _.isEmpty(this.state.value))) { if (this.state.validate.exclude_values && this.state.validate.exclude_values.size) { this.state.validate.valid = !this.state.validate.exclude_values.has(this.state.value); } else { - this.state.validate.valid = this._validator.validate(this.state.value); + //check if the type is numeric + if (['integer', 'float', 'bigint'].includes(this.state.input.type) && (+this.state.value < 0)) { + this.state.value = null; + this.state.validate.valid = !this.state.validate.required; + } else { + this.state.validate.valid = this._validator.validate(this.state.value); + } } } return this.state.validate.valid; }; + proto.setErrorMessage = function() { //in vase of if (this.state.validate.error) { From effc313d37ac6327695a9fdc908a282ac2d085f9 Mon Sep 17 00:00:00 2001 From: Raruto Date: Fri, 6 Sep 2024 15:36:00 +0200 Subject: [PATCH 02/12] avoid nested `if-else` --- src/app/gui/inputs/service.js | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/app/gui/inputs/service.js b/src/app/gui/inputs/service.js index 2816b9cb9..2dcf798e6 100644 --- a/src/app/gui/inputs/service.js +++ b/src/app/gui/inputs/service.js @@ -92,19 +92,19 @@ proto.setEmpty = function(){ // the general method to check the value of the state is valid or not proto.validate = function() { //check if input is not required (empty === true) and the value is not empty - if (!(this.state.validate.empty && _.isEmpty(this.state.value))) { - if (this.state.validate.exclude_values && this.state.validate.exclude_values.size) { - this.state.validate.valid = !this.state.validate.exclude_values.has(this.state.value); - } else { - //check if the type is numeric - if (['integer', 'float', 'bigint'].includes(this.state.input.type) && (+this.state.value < 0)) { - this.state.value = null; - this.state.validate.valid = !this.state.validate.required; - } else { - this.state.validate.valid = this._validator.validate(this.state.value); - } - } + const GIVE_ME_A_NAME_1 = !(this.state.validate.empty && _.isEmpty(this.state.value)); + const GIVE_ME_A_NAME_2 = GIVE_ME_A_NAME_1 && !(this.state.validate.empty && _.isEmpty(this.state.value)); + const GIVE_ME_A_NAME_3 = GIVE_ME_A_NAME_1 && ['integer', 'float', 'bigint'].includes(this.state.input.type) && (+this.state.value < 0); + + if (GIVE_ME_A_NAME_2) { + this.state.validate.valid = !this.state.validate.exclude_values.has(this.state.value); + } else if (GIVE_ME_A_NAME_3) { //check if the type is numeric + this.state.value = null; + this.state.validate.valid = !this.state.validate.required; + } else if (GIVE_ME_A_NAME_1) { + this.state.validate.valid = this._validator.validate(this.state.value); } + return this.state.validate.valid; }; From 99d125a5e348d069fdcc09c6a99305feea0fff5b Mon Sep 17 00:00:00 2001 From: volterra79 Date: Tue, 10 Sep 2024 08:51:22 +0200 Subject: [PATCH 03/12] :bug: Fix validation of input not required and empty --- src/app/core/layers/tablelayer.js | 6 +++--- src/app/gui/inputs/service.js | 27 ++++++++++++++++++--------- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/src/app/core/layers/tablelayer.js b/src/app/core/layers/tablelayer.js index f9779fd90..2e0a9b971 100644 --- a/src/app/core/layers/tablelayer.js +++ b/src/app/core/layers/tablelayer.js @@ -631,13 +631,13 @@ proto.getFieldsWithValues = function(obj, options = {}) { field.forceNull = false; field.validate.valid = true; field.validate._valid = true; // useful to get previous value in certain case - field.value_from_default_value = false; // need to be check if default value is set by server configuration field - field.get_default_value = get_default_value; // specify if need to get value from form field.input.options.default value in case of missing value of field.value + field.value_from_default_value = false; // need to be checked if the default value is set by server configuration field + field.get_default_value = get_default_value; // specify if you need to get value from form field.input.options.default value in case of missing value of field.value field.validate.exclude_values = new Set(); // for validate.unique purpose to check is new value iserted or change need to be di field.validate.unique = field.validate.unique || false; field.validate.required = field.validate.required || false; field.validate.mutually_valid = true; - field.validate.empty = !field.validate.required; + field.validate.empty = false; // Mean no value (field.value) set start value to false. It will be set once the input field is show field.validate.message = null; }); diff --git a/src/app/gui/inputs/service.js b/src/app/gui/inputs/service.js index 2816b9cb9..625e0a61c 100644 --- a/src/app/gui/inputs/service.js +++ b/src/app/gui/inputs/service.js @@ -85,25 +85,34 @@ proto.setValidator = function(validator) { this._validator = validator; }; -proto.setEmpty = function(){ - this.state.validate.empty = !((Array.isArray(this.state.value) && this.state.value.length) || !_.isEmpty(_.trim(this.state.value))); +/** + * set input empty '', null, undefined or [] + */ +proto.setEmpty = function() { + this.state.validate.empty = !((Array.isArray(this.state.value) && this.state.value.length > 0) || !(_.isEmpty(_.trim(this.state.value)))); }; // the general method to check the value of the state is valid or not proto.validate = function() { - //check if input is not required (empty === true) and the value is not empty - if (!(this.state.validate.empty && _.isEmpty(this.state.value))) { - if (this.state.validate.exclude_values && this.state.validate.exclude_values.size) { - this.state.validate.valid = !this.state.validate.exclude_values.has(this.state.value); - } else { - //check if the type is numeric - if (['integer', 'float', 'bigint'].includes(this.state.input.type) && (+this.state.value < 0)) { + if (this.state.validate.empty) { + this.state.value = null; //force to null + // check if you require or check validation + this.state.validate.valid = !this.state.validate.required; + } else { + if (['integer', 'float', 'bigint'].includes(this.state.input.type)) { + if (+this.state.value < 0) { this.state.value = null; + this.state.validate.empty = true; this.state.validate.valid = !this.state.validate.required; } else { this.state.validate.valid = this._validator.validate(this.state.value); } } + if (this.state.validate.exclude_values && this.state.validate.exclude_values.size) { + this.state.validate.valid = !this.state.validate.exclude_values.has(this.state.value); + } else { + this.state.validate.valid = this._validator.validate(this.state.value); + } } return this.state.validate.valid; }; From b471df90ca87238347e45786bd666f60d72b0738 Mon Sep 17 00:00:00 2001 From: volterra79 Date: Tue, 10 Sep 2024 15:57:07 +0200 Subject: [PATCH 04/12] Add conversion value of state value to compare with values from server --- src/components/InputUnique.vue | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/components/InputUnique.vue b/src/components/InputUnique.vue index 9a112e7ce..2d1aa6a45 100644 --- a/src/components/InputUnique.vue +++ b/src/components/InputUnique.vue @@ -40,10 +40,19 @@ export default { }, watch: { async 'state.input.options.values'(values) { - this.state.value = this.state.value ? this.state.value: null; - this.state.value !== null && values.indexOf(this.state.value) === -1 && this.service.addValueToValues(this.state.value); + this.state.value = this.state.value + //need to check if values are Number or string and convert it to compare + //@TODO need to find a better way to comprare input value (from input html element) value is set as string + ? ['integer', 'float', 'bigint'].includes(this.state.type) ? Number(this.state.value) : this.state.value + : null; + //check if the value is already added to value array + if (null !== this.state.value && !values.includes(this.state.value)) { + this.service.addValueToValues(this.state.value); + } await this.$nextTick(); - this.state.value && this.select2.val(this.state.value).trigger('change'); + if (this.state.value) { + this.select2.val(this.state.value).trigger('change'); + } } }, async mounted() { From deb21c49712bf991a75bca1df85d9c433ab67029 Mon Sep 17 00:00:00 2001 From: volterra79 Date: Tue, 10 Sep 2024 16:05:14 +0200 Subject: [PATCH 05/12] Comment --- src/app/gui/inputs/service.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/app/gui/inputs/service.js b/src/app/gui/inputs/service.js index f23d24f21..22bcad6eb 100644 --- a/src/app/gui/inputs/service.js +++ b/src/app/gui/inputs/service.js @@ -108,6 +108,7 @@ proto.validate = function() { this.state.validate.valid = this._validator.validate(this.state.value); } } + //check exclude_values state.validate.unique (unique input) if (this.state.validate.exclude_values && this.state.validate.exclude_values.size) { this.state.validate.valid = !this.state.validate.exclude_values.has(this.state.value); } else { From 999296b441988d8bbcead4d146f8d953b99a54bd Mon Sep 17 00:00:00 2001 From: volterra79 Date: Thu, 12 Sep 2024 16:57:12 +0200 Subject: [PATCH 06/12] force add options values array in case validate.unique --- src/app/core/layers/tablelayer.js | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/app/core/layers/tablelayer.js b/src/app/core/layers/tablelayer.js index 2e0a9b971..444055bf7 100644 --- a/src/app/core/layers/tablelayer.js +++ b/src/app/core/layers/tablelayer.js @@ -615,12 +615,6 @@ proto.getFieldsWithValues = function(obj, options = {}) { field._value = attributes[field.name]; // store original value field.update = false; // at beginning set update false. Used to form - if (field.input) { - const options = this.getEditingFields().find(f => f.name === field.name).input.options; - field.input.options.loading = options.loading || { state: null }; - field.input.options.values = options.values; - } - field.visible = exclude.indexOf(field.name) === -1; // exclude contain field to set visible false // for editing purpose @@ -639,6 +633,14 @@ proto.getFieldsWithValues = function(obj, options = {}) { field.validate.mutually_valid = true; field.validate.empty = false; // Mean no value (field.value) set start value to false. It will be set once the input field is show field.validate.message = null; + + if (field.input) { + const options = this.getEditingFields().find(f => f.name === field.name).input.options; + field.input.options.loading = options.loading || { state: null }; + //need to be force to set an array in case of field.validate.unique, mean need to check that value is unique + field.input.options.values = options.values || (field.validate.unique ? [] : undefined); + } + }); return fields; From 24cc2fe21a8b7074dc04692414132061f8aafd38 Mon Sep 17 00:00:00 2001 From: volterra79 Date: Thu, 12 Sep 2024 16:58:00 +0200 Subject: [PATCH 07/12] Simplify checkbox --- src/components/InputCheckbox.vue | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/components/InputCheckbox.vue b/src/components/InputCheckbox.vue index 700fe6643..ba388cd4b 100644 --- a/src/components/InputCheckbox.vue +++ b/src/components/InputCheckbox.vue @@ -57,11 +57,10 @@ export default { this.setLabel(); } }, - created() { - this.value = this.state.forceNull ? this.value : this.service.convertValueToChecked(); - }, mounted() { - if (!this.state.forceNull) this.setLabel(); + if (this.state.forceNull) { + this.setLabel(); + } } }; \ No newline at end of file From bbafd12fd7b7100c8a2fe8fb386d2b382e7f20de Mon Sep 17 00:00:00 2001 From: volterra79 Date: Thu, 12 Sep 2024 16:59:01 +0200 Subject: [PATCH 08/12] Fix validation of exlude_value fro this.state.validate.unique general --- src/app/gui/inputs/service.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/app/gui/inputs/service.js b/src/app/gui/inputs/service.js index 22bcad6eb..81ec04627 100644 --- a/src/app/gui/inputs/service.js +++ b/src/app/gui/inputs/service.js @@ -108,9 +108,10 @@ proto.validate = function() { this.state.validate.valid = this._validator.validate(this.state.value); } } - //check exclude_values state.validate.unique (unique input) - if (this.state.validate.exclude_values && this.state.validate.exclude_values.size) { - this.state.validate.valid = !this.state.validate.exclude_values.has(this.state.value); + //check exclude_values state.validate.unique (QGIS field property [x] Enforce unique constraint) + if (this.state.validate.unique && this.state.validate.exclude_values && this.state.validate.exclude_values.size) { + //need to convert this.state.value to string because editing store exclude_values items as string + this.state.validate.valid = !this.state.validate.exclude_values.has(`${this.state.value}`); } else { this.state.validate.valid = this._validator.validate(this.state.value); } @@ -133,7 +134,7 @@ proto.setErrorMessage = function() { this.state.validate.message = `${t("sdk.form.inputs.input_validation_max_field")} (${this.state.validate.max_field})`; } else if (this.state.validate.min_field) { this.state.validate.message = `${t("sdk.form.inputs.input_validation_min_field")} (${this.state.validate.min_field})`; - } else if (this.state.validate.unique && this.state.validate.exclude_values && this.state.validate.exclude_values.size) { + } else if (('unique' === this.state.input.type || this.state.validate.unique) && this.state.validate.exclude_values && this.state.validate.exclude_values.size) { this.state.validate.message = `${t("sdk.form.inputs.input_validation_exclude_values")}`; } else if (this.state.validate.required) { message = `${t("sdk.form.inputs.input_validation_error")} ( ${t("sdk.form.inputs." + this.state.type)} )`; From c15fe7f2ae2e1eba47232cdb6fe91b8b4f58e303 Mon Sep 17 00:00:00 2001 From: volterra79 Date: Thu, 12 Sep 2024 16:59:50 +0200 Subject: [PATCH 09/12] Change behavior of input unique widget --- src/components/InputUnique.vue | 60 ++++++++++++++++------------------ 1 file changed, 28 insertions(+), 32 deletions(-) diff --git a/src/components/InputUnique.vue b/src/components/InputUnique.vue index 2d1aa6a45..adc3b86e2 100644 --- a/src/components/InputUnique.vue +++ b/src/components/InputUnique.vue @@ -4,13 +4,12 @@ -->