fix the setting defaults for radio and checkboxes when values are non-string
authorKurund Jalmi <kurundjalmi@thirdsectordesign.org>
Fri, 17 Feb 2023 22:00:34 +0000 (22:00 +0000)
committerKurund Jalmi <kurundjalmi@thirdsectordesign.org>
Mon, 31 Jul 2023 10:30:20 +0000 (11:30 +0100)
ext/afform/core/Civi/Afform/FormDataModel.php
ext/afform/core/ang/af/afField.component.js

index a5e07402eae41a305cb73fce872373a14d61c9a3..816758c550c00029e1eeb366269204071bdd910e 100644 (file)
@@ -207,7 +207,7 @@ class FormDataModel {
     if ($action === 'get' && strpos($fieldName, '.')) {
       $namesToMatch[] = substr($fieldName, 0, strrpos($fieldName, '.'));
     }
-    $select = ['name', 'label', 'input_type', 'input_attrs', 'help_pre', 'help_post', 'options', 'fk_entity', 'required'];
+    $select = ['name', 'label', 'input_type', 'data_type', 'input_attrs', 'help_pre', 'help_post', 'options', 'fk_entity', 'required'];
     if ($action === 'get') {
       $select[] = 'operators';
     }
index f579eedb7987fa5149f08918b98f6e715be133dd..2b46d142f41b41ffd166ce479c5d62942ab9aff3 100644 (file)
         });
       };
 
+      // correct the type for the value, make sure numbers are numbers and not string
+      function correctValueType(value, dataType) {
+        // let's skip type correction for null values
+        if (value === null) {
+          return value;
+        }
+
+        // if value is a number than change it to number
+        if (Array.isArray(value)) {
+          var newValue = [];
+          value.forEach((v, index) => {
+            newValue[index] = correctValueType(v);
+          });
+          value = newValue;
+        } else if (dataType == 'Integer') {
+          value = +value;
+        } else if (dataType == 'Boolean') {
+          value = (value == 1);
+        }
+        return value;
+      }
+
       // Set default value; ensure data type matches input type
       function setValue(value) {
+        // correct the value type
+        value = correctValueType(value, ctrl.defn.data_type);
+
         if (ctrl.defn.input_type === 'Number' && ctrl.defn.search_range) {
           if (!_.isPlainObject(value)) {
             value = {