Render Email input as type="email"
authorcolemanw <coleman@civicrm.org>
Mon, 3 Jul 2023 02:05:56 +0000 (22:05 -0400)
committercolemanw <coleman@civicrm.org>
Mon, 3 Jul 2023 15:05:02 +0000 (11:05 -0400)
Fixes dev/core#4300

CRM/Core/DAO/Email.php
Civi/Api4/Generic/BasicGetFieldsAction.php
ext/afform/admin/ang/afGuiEditor/inputType/Email.html [new file with mode: 0644]
ext/afform/core/ang/af/fields/Email.html [new file with mode: 0644]
ext/search_kit/ang/crmSearchTasks/crmSearchInput/crmSearchInputVal.component.js
ext/search_kit/ang/crmSearchTasks/crmSearchInput/email.html [new file with mode: 0644]
ext/search_kit/tests/phpunit/api/v4/SearchDisplay/SearchRunTest.php
xml/schema/Core/Email.xml

index 8fa3121e6b3dd26e2abd5fd5b84d83765d589fa8..72112be2b8bd1f5acfc8fce0c6c39f3bc5c734d8 100644 (file)
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Core/Email.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:466e1cb583d12b018b7deb2c946c2d44)
+ * (GenCodeChecksum:df7f07aea847edcfd8aeb02390f2e5ba)
  */
 
 /**
@@ -288,7 +288,7 @@ class CRM_Core_DAO_Email extends CRM_Core_DAO {
           'bao' => 'CRM_Core_BAO_Email',
           'localizable' => 0,
           'html' => [
-            'type' => 'Text',
+            'type' => 'Email',
           ],
           'add' => '1.1',
         ],
index 26780be1ee0e3a3b6cb0fbc363a1d22bcd5307fe..c3f34416f6f8e9d603eafbc0031dad10f7f2cb55 100644 (file)
@@ -321,13 +321,14 @@ class BasicGetFieldsAction extends BasicGetAction {
           'ChainSelect' => ts('Chain-Select'),
           'CheckBox' => ts('Checkboxes'),
           'Date' => ts('Date Picker'),
+          'Email' => ts('Email'),
           'EntityRef' => ts('Autocomplete Entity'),
           'File' => ts('File'),
+          'Location' => ts('Address Location'),
           'Number' => ts('Number'),
           'Radio' => ts('Radio Buttons'),
           'Select' => ts('Select'),
           'Text' => ts('Text'),
-          'Location' => ts('Address Location'),
         ],
       ],
       [
diff --git a/ext/afform/admin/ang/afGuiEditor/inputType/Email.html b/ext/afform/admin/ang/afGuiEditor/inputType/Email.html
new file mode 100644 (file)
index 0000000..e515ba3
--- /dev/null
@@ -0,0 +1,6 @@
+<div class="form-inline">
+  <div class="form-group" ng-repeat="i in $ctrl.getRangeElements('Text')">
+    <span class="af-field-range-sep" ng-if="i">-</span>
+    <input autocomplete="off" class="form-control" ng-model="getSet('input_attrs.placeholder' + i)" ng-model-options="$ctrl.editor.debounceWithGetterSetter" type="text" title="{{:: ts('Click to add placeholder text') }}"/>
+  </div>
+</div>
diff --git a/ext/afform/core/ang/af/fields/Email.html b/ext/afform/core/ang/af/fields/Email.html
new file mode 100644 (file)
index 0000000..b3eefdf
--- /dev/null
@@ -0,0 +1,6 @@
+<input ng-if=":: !$ctrl.defn.search_range" class="form-control" type="email" ng-required="$ctrl.defn.required" id="{{:: fieldId }}" ng-model="getSetValue" ng-model-options="{getterSetter: true}" placeholder="{{:: $ctrl.defn.input_attrs.placeholder }}" >
+<div ng-if=":: $ctrl.defn.search_range" class="form-inline">
+  <input class="form-control" type="email" id="{{:: fieldId }}" ng-model="dataProvider.getFieldData()[$ctrl.fieldName]['>=']" placeholder="{{:: $ctrl.defn.input_attrs.placeholder }}" >
+  <span class="af-field-range-sep">-</span>
+  <input class="form-control" type="email" id="{{:: fieldId }}2" ng-model="dataProvider.getFieldData()[$ctrl.fieldName]['<=']" placeholder="{{:: $ctrl.defn.input_attrs.placeholder2 }}" >
+</div>
index 0168ba0d20854daa592c3d20e65717278580c72a..102e2bc36f78541ca6ff04d4b6c74ada81cae0ca 100644 (file)
           return '~/crmSearchTasks/crmSearchInput/float.html';
         }
 
+        if (field.input_type === 'Email') {
+          return '~/crmSearchTasks/crmSearchInput/email.html';
+        }
+
         return '~/crmSearchTasks/crmSearchInput/text.html';
       };
 
diff --git a/ext/search_kit/ang/crmSearchTasks/crmSearchInput/email.html b/ext/search_kit/ang/crmSearchTasks/crmSearchInput/email.html
new file mode 100644 (file)
index 0000000..26e2bf8
--- /dev/null
@@ -0,0 +1,6 @@
+<div class="form-group" ng-if="!$ctrl.isMulti()" >
+  <input type="email" class="form-control" ng-model="$ctrl.value" ng-required="!$ctrl.field.nullable">
+</div>
+<div class="form-group" ng-if="$ctrl.isMulti()" >
+  <input class="form-control" ng-model="$ctrl.value" ng-required="!$ctrl.field.nullable" crm-ui-select="{multiple: true, tags: [], tokenSeparators: [','], formatNoMatches: ''}" ng-list>
+</div>
index a0fe56eef5ec8c5ab759066943725379688bf629..9efcb9c7b4890769bd793bad747a1f16be43dbe5 100644 (file)
@@ -406,7 +406,7 @@ class SearchRunTest extends Api4TestBase implements TransactionalInterface {
     $this->assertEquals('testmail@unit.test', $result[0]['columns'][1]['val']);
     $this->assertEquals($email, $result[0]['columns'][1]['edit']['record']['id']);
     $this->assertEquals('Email', $result[0]['columns'][1]['edit']['entity']);
-    $this->assertEquals('Text', $result[0]['columns'][1]['edit']['input_type']);
+    $this->assertEquals('Email', $result[0]['columns'][1]['edit']['input_type']);
     $this->assertEquals('String', $result[0]['columns'][1]['edit']['data_type']);
     $this->assertEquals('email', $result[0]['columns'][1]['edit']['value_key']);
     $this->assertEquals('update', $result[0]['columns'][1]['edit']['action']);
@@ -436,7 +436,7 @@ class SearchRunTest extends Api4TestBase implements TransactionalInterface {
     $this->assertNull($result[1]['columns'][1]['val']);
     $this->assertEquals(['contact_id' => $contacts[1], 'is_primary' => TRUE], $result[1]['columns'][1]['edit']['record']);
     $this->assertEquals('Email', $result[1]['columns'][1]['edit']['entity']);
-    $this->assertEquals('Text', $result[1]['columns'][1]['edit']['input_type']);
+    $this->assertEquals('Email', $result[1]['columns'][1]['edit']['input_type']);
     $this->assertEquals('String', $result[1]['columns'][1]['edit']['data_type']);
     $this->assertEquals('email', $result[1]['columns'][1]['edit']['value_key']);
     $this->assertEquals('create', $result[1]['columns'][1]['edit']['action']);
index f06cfa6ee1c5e5aef1fd79842192b2505b6fc461..83cf71f429baae850bf01c9817bbf0583a4d0104 100644 (file)
@@ -67,7 +67,7 @@
     <type>varchar</type>
     <length>254</length>
     <html>
-      <type>Text</type>
+      <type>Email</type>
       <size>30</size>
     </html>
     <import>true</import>